반응형

2020 카카오 코딩 테스트 1차 문제

문제풀이

https://tech.kakao.com/2019/10/02/kakao-blind-recruitment-2020-round1/

 

2020 신입 개발자 블라인드 채용 1차 코딩 테스트 문제 해설

올해에도 2020이라는 멋진 숫자와 함께, 카카오의 신입 개발자 채용을 시작했습니다! 그 여정 중 첫 단계로 1차 코딩 테스트가 지난 9월 7일 토요일 오후 2시부터 오후 7시까지 5시간 동안 진행됐는데요. 저희 준비위원들도 설렘과 긴장 속에 원활한 진행을 위해 노력했고, 무사히 1차 테스트를 마칠 수 있었습니다. 테스트에는 총 7문제가 출제됐고, 응시자는 5시간 이내에 순서와 상관없이 문제를 해결해야 […]

tech.kakao.com

여기에 써있는 풀이를 그대로 구현했다.

1. 자물쇠가 N*N 행렬이라면, 3N*3N 매트릭스를 만든 후, 가운데 자물쇠를 배치한다.

2. 열쇠를 매트릭스에 올려놓고 한 칸씩 움직이며 3N*3N 행렬의 가운데가 모두 1이 되는지 확인한다.

3. 2에서 찾지 못한다면 열쇠를 90도 돌려서 다시 2 과정을 수행한다.

4. 4번 돌렸는데도(360도) 찾지 못한다면 불가능한 경우이다.

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class Solution {
    public boolean solution(int[][] key, int[][] lock) {
        int lockLen = lock.length;
        int[][] l = new int[lockLen*3][lockLen*3];
        for(int i=0;i<lockLen;i++) {
            for(int j=0;j<lockLen;j++) {
                l[i+lockLen][j+lockLen] = lock[i][j];
            }
        }
        for(int r=0; r<4;r++) {
            key=rotate(key);
            boolean check = compare(key,l);
            if(check)return true;
        }
        return false;
    }
    public int[][] rotate(int[][] key){
        int len = key.length;
        int[][] ans = new int[len][len];
        for(int i=0;i<len;i++) {
            for(int j=0;j<len;j++) {
                ans[j][len-1-i] = key[i][j];
            }
        }
        return ans;
    }
    public boolean compare(int[][] key, int[][] lock) {
        int keyLen = key.length;
        int lockLen = lock.length;
        int diff = lockLen-keyLen;
        for(int iMove=0; iMove<=diff;iMove++) {
            for(int jMove=0; jMove<=diff;jMove++) {
                int[][] tempKey = new int[lockLen][lockLen];
                for(int i=0;i<keyLen;i++) {
                    for(int j=0;j<keyLen;j++) {
                        tempKey[i+iMove][j+jMove] = key[i][j];
                    }
                }
                boolean check = check(tempKey,lock);
                if(check)return true;
            }
        }
        return false;
    }
    public boolean check(int[][] key, int[][] lock) {
        int len = lock.length/3;
        for(int i=len;i<len*2;i++) {
            for(int j=len;j<len*2;j++) {
                if(key[i][j]+lock[i][j]!=1) {
                    return false;
                }
            }
        }
        return true;
    }
}
cs

Line 17 : 열쇠를 90도 회전시키는 함수이다.

Line 27 : 열쇠를 3N*3N 행렬에 올려놓고 한칸씩 움직이는 과정이다.

Line 45 : 열쇠와 자물쇠가 맞는지 확인하는 함수이다.

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

문제풀이

 1. 공백 이후의 첫자가 알파벳이면 대문자로 바꾼다.

 2. 두번째 이후의 글자가 알파벳이면 소문자로 바꾼다.

 

* 주의해야 할 예제 : 공백이 두번 이상 나오는 경우를 고려해야 한다.

Java Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package programmers;
 
class Solution {
    public String solution(String s) {
        StringBuilder sb = new StringBuilder();
        boolean first = true;
        for (int i =0; i<s.length() ; i++) {
            char c = s.charAt(i);
            if(first) {
                if(isAlpha(c)) {
                    sb.append(Character.toUpperCase(c));
                    first=false;
                }else if(c==' ') {
                    sb.append(c);
                }
                else {
                    sb.append(c);
                    first=false;
                }
            }else {
                if(isAlpha(c)) {
                    sb.append(Character.toLowerCase(c));
                }else if(c == ' ') {
                    sb.append(c);
                    first=true;
                }else {
                    sb.append(c);
                }
            }
        }
        
        return sb.toString();
    }
    public boolean isAlpha(char c) {
        if((c>='a' && c<='z'|| (c>='A' && c<='Z')) {
            return true;
        }else {
            return false;
        }
    }
}
cs

Line 6 : first 변수는 해당 문자가 공백 이후 첫번째 문자인지를 알려주는 변수이다.

Line 13 : 연속으로 빈칸이 나오는 경우에 first 변수에 대해서 주의해야 한다.

Line 34 : isAlpha 메소드는 해당 문자가 알파벳인지 확인하는 메소드이다.

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

2018 KAKAO BLIND RECRUITMENT 문제이다.

문제 풀이

 1. 먼저 문자열을 2자씩 끊은 후, 정규표현식을 이용하여 두자가 모두 알파벳으로 되어있는지 확인한다.

 2. 두자 모두 알파벳으로 되어있다면 str1, str2 각각의 리스트에 모두 소문자로 바꾸어 넣어준다.("FR"과 "fr"을 같은 단어로 인식하기 위함으로 꼭 소문자가 아니더라도 둘의 양식을 맞춰주면 된다.)

 3. 합집합과 교집합의 원소의 수를 세어 자카드 유사도를 반환한다.

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import re
 
def solution(str1, str2):
    checker = re.compile('[a-zA-Z]{2}')
    answer = 0
    
    token1 = []
    token2 = []
    # tokenize
    for i in range(len(str1)-1):
        t1 = str1[i:i+2]
        if checker.match(t1) != None:
            token1.append(t1.lower())
    for i in range(len(str2)):
        t2 = str2[i:i+2]
        if checker.match(t2) != None:
            token2.append(t2.lower())
    
    intersection = 0
    union = 0
    
    for t in token1:
        if t in token2:
            intersection+=1
            union += 1
            token2.remove(t)
        else :
            union+=1
    union += len(token2)
    return int((intersection/union) * 65536if intersection+union != 0 else 65536
cs

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

문제 풀이

1. ANIMAL_IN 과 ANIMAL_OUT 테이블을 ANIMAL_ID 컬럼으로 이너 조인 한 후, 두 테이블의 DATETIME 컬럼의 차를 구한다.

2. DATETIME 컬럼의 차를 기준으로 내림차순 정렬한다.

3. 2로 구한 테이블에서 상위 2개를 출력한다.

ORACLE Code

1
2
3
4
5
6
7
8
SELECT ANIMAL_ID, NAME
FROM 
(SELECT I.ANIMAL_ID, I.NAME, O.DATETIME - I.DATETIME AS 시간
FROM ANIMAL_INS I INNER JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY 시간 DESC
)
WHERE ROWNUM < 3
cs

 

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

문제 풀이

SEX_UPON_INTAKE 의 도메인은 (Neutered, Spayed, Intact) + (Male, Female) 이므로, 첫자가 N이나 S이면 중성화가 된것이다. 따라서 substr 함수를 이용하여 첫자만 따서 확인한다.

Code

1
2
3
4
5
6
SELECT ANIMAL_ID, NAME, 
(CASE WHEN SUBSTR(SEX_UPON_INTAKE,1,1) IN ('N','S') THEN 'O'
ELSE 'X'
END) AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
cs

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

2018 KAKAO BLIND RECRUITMENT 문제로 LZW 압축을 구현하는 문제이다.

 

문제 풀이

 1. 먼저 각 문자열에 대한 색인 번호를 넣을 사전을 선언한다.

 2. A - Z 까지를 색인 번호 1 - 26 으로 넣어준다.

 3. 맨 앞 문자부터 사전에서 찾아보며 사전에 있으면 문자열의 길이를 늘려가며 찾는다. 문자열이 사전에서 없어지면 해당 문자열을 색인번호의 최댓값에 1을 더해 넣는다. 

 4. 3과정에서 사전에 있는 가장 긴 문자열을 answer에 넣는다.

 5. 다음 문자부터 3-4과정을 반복한다.

 예를 들면, 'KAKAO'의 경우, K를 먼저 찾고 있으면 KA를 찾고 또 있으면 KAK를 찾는 식으로 진행하며 해당 문자열이 사전에 없을 때 까지 진행하여, 해당 문자열이 사전에 없으면 사전에 넣고, 다음 문자부터 다시 시작한다. KA까지 사전에 있다면 KAK를 사전에 넣고, KA의 색인 번호를 answer에 넣는다.

Python Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from string import ascii_uppercase
def solution(msg):
    dic = {}
    idx=1
    for a in ascii_uppercase:
        dic[a] = idx
        idx+=1
    answer = []
 
    i=0
    j=i+1
    while i < len(msg)-1:
        j=i+1
        while j<= len(msg) and msg[i:j] in dic:
            j+=1
        #msg[i:j-1]는 dic에 있다
        answer.append(dic[msg[i:j-1]])
        dic[msg[i:j]]=idx
        idx += 1
        i=j-1
        #print(dic)
    if i == len(msg)-1:
        answer.append(dic[msg[-1]])
    return answer
cs

 

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

문제 풀이

 1. 간단한 dp 문제로, n번째 타일 장식물의 한 변의 길이 dp[n]에 대한 점화식은 다음과 같다.

 dp[n] = dp[n-1]+dp[n-2]

 2. 문제는 n번째 타일 장식물까지 붙였을 때, 가장 바깥의 둘레를 구하는 것인데, 예제에서 제시한 아래의 그림을 살펴보면, 계속 직사각형 형태를 띔으로 상하, 좌우의 길이는 각각 같다. 또한, 상하 또는 좌우의 길이 중 하나는 마지막 타일 장식물의 한 변의 길이가 되며, 나머지 한 변의 길이는 마지막 타일 장식물의 길이와 그 전 타일 장식물의 길이가 된다. 

예를 들면, 5개의 타일 장식물이 붙은 경우에는, 세로의 길이는 마지막 타일의 길이인 5 이고, 가로의 길이는 마지막 타일 장식물의 길이인 5에 이전 타일 장식물의 길이인 3을 더한 8이다. 6개의 타일 장식물을 붙였을 경우에는 가로가 8, 세로는 8(마지막 장식물의 길이)+5(이전 장식물의 길이) 인 13이 된다.

 따라서 n개의 타일 장식물을 붙였을 때의 둘레는 2*dp[n] + 2(dp[n]+dp[n-1]) 이 된다.

 

Python Code

1
2
3
4
5
6
def solution(N):
    dp = [1,1]
    for i in range(2,N):
        dp.append(dp[-1]+dp[-2])
    if N==1 : return 4
    return (2*dp[-1])+(2*(dp[-2]+dp[-1]))
cs

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
반응형

문제풀이

 N개의 퀸을 하나씩 가능한 자리에 놓는 dfs 문제이다.

 1. N*N 체스판에 N개의 퀸을 놓으므로 한 열에 퀸을 하나씩 놓으면 된다.

 2. answer를 static 변수로 선언해 둔다.

 3. depth가 i 일 때, i번째 열의 퀸의 위치를 결정하며, depth를 1씩 증가시켜간다.

 3-1. i번째 열의 퀸의 위치를 결정할 때는 j<i인 j 열의 퀸들의 위치를 참고한다. i번째 퀸과 j번째 퀸의 행이 같으면 안되며 대각선에 있어도 안된다.(row_i - row_j != col_i - col_j)

 4. depth가 N이 되면 2에서 선언한 answer에 1을 더해준다.

 5. 가능한 모든 경우에 대하여 3 ~ 4 를 반복한 후 answer를 반환한다.

 

Java Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class Solution {
    static int answer = 0;
    static int combi = 0;
    public int solution(int n) {
        int[] coord = new int[n];
        
        for(int i=0; i<n ; i++) {
            coord[0= i;
            explore(coord, 1 , n);
        }
        
        return answer;
    }
    
    public void explore(int[] coord, int depth, int n) {
        if(depth==n) {
            answer+=1;
            return ;
        }
        for(int i = 0 ; i < n ; i++) {
            coord[depth] = i ;
            if(check(coord, depth)) {
                explore(coord, depth+1 , n);
            }
        }
    }
    
    public boolean check(int[] coord, int depth) {
        for(int i = 0 ; i< depth ; i++) {
            if(!checkPair(coord,i,depth)) {
                return false;
            }
        }
        return true;
    }
    public boolean checkPair(int[] coord, int i, int j) {
        if(coord[i]==coord[j]) {
            return false;
        }else if(Math.abs(i-j)==Math.abs(coord[i]-coord[j])) {
            return false;
        }else {
            return true;
        }
    }
}
cs

Line 4 의 solution method가 main method로, 첫번째 열의 퀸의 위치를 결정한 후 dfs(explore method)를 호출한다.

Line 15 의 explore method가 dfs를 실행하는 부분으로, depth가 n이 되면 answer에 1을 더해주며, depth가 n보다 작은 경우에는 depth 열의 퀸의 위치를 결정한다. depth 열의 퀸의 가능한 모든 위치에 대하여 depth+1로 다시 explore method를 호출한다.

Line 28의 check method와 line 36의 checkPair method로 과정 3-1의 조건을 구현한다. checkPair는 두 개의 퀸의 위치를 비교하며, check에서 마지막 퀸의 위치와 이전 퀸들의 위치를 비교한다. 이전 퀸들 간의 위치는 이전 depth에서 고려했을 것이므로 다시 할 필요는 없다.

 

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형

+ Recent posts