상세 컨텐츠

본문 제목

[1일 1커밋 1D] LeetCode SQL & SWEA S/W 문제해결 기본 3일차 끝

취준/2. 코딩테스트

by ranlan 2024. 9. 3. 18:44

본문

728x90

친한 동료와 시작한 1일 1커밋 챌린지.. 어제 시작했는데 포스팅은 오늘함. 1일 1짱구 할거임!

 

LeetCode SQL 50

Select | 1757. Recyclable and Low Fat Products

SELECT PRODUCT_ID
FROM PRODUCTS
WHERE LOW_FATS = 'Y' AND RECYCLABLE = 'Y'

 

Select | 584. Find Customer Referee

SELECT NAME
FROM CUSTOMER
WHERE REFEREE_ID IS NULL OR REFEREE_ID != 2

 

Basic Joins | 1378. Replace Employee ID With The Unique Identifier

SELECT UNIQUE_ID, NAME
FROM EMPLOYEES A
LEFT OUTER JOIN EmployeeUNI B
ON A.ID = B.ID

 


 

SWEA SW Expert Academy

1213. [S/W 문제해결 기본] 3일차 - String (D3)

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14P0c6AAUCFAYi

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int count;
    for(int tc=0; tc<10; tc++) {
        int n = sc.nextInt();

        count = 0;
        String s1 = sc.next();
        String s2 = sc.next();
        count = (s2.length()-s2.replace(s1, "").length())/s1.length();

        System.out.printf("#%d %d\n", n, count);
    }
}

이전에 문자열에서 특정 문자(또는 문자열) 카운팅 하는 방법으로 알아뒀던 로직 활용했다. 사실 replace() 함수 char 만 가능한줄 알고 문자열을 어떻게 찾지 했는데 문자열 찾기도 가능한듯..~ 

 

1215. [S/W 문제해결 기본] 3일차 - 회문1 (D3)

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14QpAaAAwCFAYi

static String[][] arr;
static int count;
static boolean flag;
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    for(int tc=0; tc<10; tc++) {
        int n = sc.nextInt(); // 회문의 길이 

        arr = new String[8][8];

        for(int i=0; i<8; i++) {
            String[] input = sc.next().split("");
            for(int j=0; j<8; j++) arr[i][j] = input[j];
        }

        count = 0;

        int k;
        for(int i=0; i<8; i++) {
            for(int j=0; j<9-n; j++) {
                int end=n+j-1; // 회문 길이 end
                for(k=0; k<n/2; k++) {
                    if(!arr[i][j+k].equals(arr[i][end-k])) break;
                }
                if(k==n/2) count++;
            }
        }

        for(int i=0; i<8; i++) {
            for(int j=0; j<9-n; j++) {
                int end=n+j-1; // 회문 길이 end
                for(k=0; k<n/2; k++) {
                    if(!arr[j+k][i].equals(arr[end-k][i])) break;
                }
                if(k==n/2) count++;
            }
        }

        System.out.printf("#%d %d\n", tc+1, count);
    }
}

중요한 점은 회문의 길이가 정해져있음과 회문의 뜻, 거꾸로 읽어도 같은 단어임으로 양끝에서부터 비교해서 온다는 것

반복문을 이렇게 삼중으로 돌려도 되나 싶었는데 되더라

 

1216. [S/W 문제해결 기본] 3일차 - 회문2 (D3)

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV14Rq5aABUCFAYi

위의 1215 문제와 비슷. 위의 문제는 회문 길이가 정해져있다면 이 문제는 회문을 찾아 (가장 긴) 회문의 길이를 구해야한다.

static String[][] arr;
static int len=0;
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    for(int tc=0; tc<10; tc++) {
        int tcn = sc.nextInt();

        arr = new String[100][100];
        len = 0;

        for(int i=0; i<100; i++) {
            String[] input = sc.next().split("");
            for(int j=0; j<100; j++) arr[i][j]=input[j];
        }

        int end;
        boolean flag=false;
        int i, j, k, n;

        // 가로 회문 체크 
        for(n=100; n>=1; n--) {
            for(i=0; i<100-n; i++) {
                for(j=0; j<100-n; j++) {
                    flag=false;
                    for(k=0; k<n/2; k++) {
                        if(j+k>=100 || j+n-k>=100) break;
                        if(!arr[i][j+k].equals(arr[i][j+n-k])) break;  
                    }
                    if(k==n/2) {
                        len = Math.max(len, n); 
                    }
                }
            }
        }

        // 세로 회문 체크 
        for(n=100; n>=1; n--) {
            for(i=0; i<100-n+1; i++) {
                for(j=0; j<100-n; j++) {
                    flag=false;
                    for(k=0; k<n/2; k++) {
                        if(j+k>=100 || j+n-k>=100) break;
                        if(!arr[j+k][i].equals(arr[j+n-k][i])) break;  
                    }
                    if(k==n/2) {
                        len = Math.max(len, n);
                    }
                }
            }
        }


        System.out.printf("#%d %d\n", tcn, len);
    }
}

알고리즘은 필요없는 단순 구현 문제이지만, 반복문이 많아 헷갈리지 않게 주의해야함

* 길이가 긴 회문을 구해야 함으로 회문 길이를 의미하는 변수인 n은 내림차순으로 내려올 것

 

 

728x90

관련글 더보기

댓글 영역