The Way

2020 KAKAO BLIND RECRUITMENT 구경 본문

PS

2020 KAKAO BLIND RECRUITMENT 구경

Jeonggyun 2019. 9. 7. 23:44

아직 미필이기 때문에 지원 자격은 안되지만, 어떤 문제가 나오는지 궁금해서 쳐봤다.

오후 2시~오후 7시까지 5시간동안 진행되며, 7문제를 풀면 된다.

https://www.welcomekakao.com/competitions/102/2020-kakao-blind-recruitment


난이도는 대개 기업의 코딩테스트가 그렇듯 어려운 편은 아니다.

나는 약속도 있었고, 괜히 한명의 탈락자를 만드는 불상사가 발생할까봐 오후 5시에 시작해서, 2시간동안 7문제 중 5문제를 풀었다. 10분 정도 더 있었으면 6문제를 풀었을 듯...


한 가지 느낀 점은 기업 코딩테스트라 코딩스타일을 "통용적으로 좋은 스타일로 여겨지도록" 작성할 필요성이 있다.

예를 들어서 그냥 백준을 풀 때는 전역변수를 사용할 때 전혀 망설임이 없었지만, 이런 코딩테스트에서는 전역변수를 써도 될지 약간 고민이 된다.

다중 for문을 탈출할 때 goto를 쓰는 것은 아주 편한데, 이것도 조금 꺼려지고 return true를 return 1로 쓴다던지, 이런 소소한 코딩이 약간 애매해진다.

일단 사용을 하긴 했다만, 이 부분은 조금 더 고민을 해보아야겠다.


어차피 카카오 기술 블로그에 풀이가 올라오긴 하겠다만 간략하게 써본다.


언젠가 문제들이 https://www.welcomekakao.com/learn/challenges?tab=all_challenges에 올라올텐데, 언제 올라올지는 잘 모르겠다.

문제 텍스트가 없으니 문제가 궁금한 사람은 나중에 올라오면 읽어보자.



1번. 문자열을 압축하는 문제

문자열을 압축시켜 가장 적은 길이로 만드는 문제이다. 예를 들어 abababab를 2개씩 압축하면 4ab가 되고, 4개씩 압축하면 2abab가 된다. 그 외 길이로는 압축불가능이다. 굳이 따지면 8개씩 1abababab가 가능하긴 할텐데 이러면 길이가 늘어나서 할 이유가 없다. 아무튼 그래서 최소 길이는 3이다.

압축을 중간중간 여러 번 할 수도 있는데, ababcdababef같은 경우 길이 2로 압축시켜서, 2abcd2abef 이렇게 압축시킬 수 있고 이게 최선이다.

항상 앞에서부터 같은 길이씩으로만 끊을 수 있는데, xabababab같은 경우 x4ab 이렇게는 못 끊고, xa/ba/ba/ba/b 이렇게 끊겨서 xa3bab로는 만들 수 있다.


압축할 수 있는 경우, 항상 압축을 하는 것이 최소 본전이거나 더 이득이다.

문자열 길이가 최대 1000이므로, 그냥 각 길이마다 다 비교하면서 작성하는 $O(n^2)$풀이도 시간초과가 나지 않는다.

길이 1로 압축해보고, 2로 압축해보고, ..., s.size() / 2로 압축해보고.. 를 반복하면 된다.


문자열 해싱을 사용한다면 길이가 100만 정도일 때도 1초 안쪽으로 구할 수 있다.




2번. 올바른 괄호 문자열

균형잡힌 괄호 문자열을 올바른 괄호 문자열로 바꾸는 문제이다.

문제 지문에 어떤 알고리즘을 쓰면 되는지 친절히 나와있는데, 그대로 구현하면 된다.


재귀함수로 구현하면 복잡도가 $O(n^2)$인데, 마찬가지로 n = 1000이라 문제없다.




3번. 열쇠랑 자물쇠 문제

(n이 20이었는지 40이었는지가 잘 기억이 안 나서 40이라고 가정하고 쓴다)

이런 문제는 시간 복잡도를 잘 따져보아야 하는데,

회전할 수 있는 경우의 수가 4이고 체크해야 할 자물쇠의 위치는 $(n+m-1)^2$개, 한 번 체크할 때마다 $m^2$번 체크해야 하므로 연산 횟수는 최대 $4 \times 40^2 \times 80^2$으로 4000만 정도이다.

대략 수백ms 정도에 돌아갈 정도이므로 다 체크해보면 된다.




4번. 가사와 쿼리 문제

이게 나름 고인물 문제인 것 같다. 트라이라는 자료구조를 사용한다면 정확성과 효율성 둘 다 만족시킬 수 있다.

물음표는 prefix로 붙거나 suffix로 붙거나 둘 중 하나이므로 일반 word로 트라이를 만들고, 모든 word를 reverse해서 트라이를 만든 후

??abc 꼴의 쿼리는 reverse된 word로 만든 트라이에서, abc?? 꼴의 쿼리는 그냥 트라이에서 갯수를 찾으면 된다.

구현하는 데에서 차이가 있긴 하겠지만, 내 생각에 길이별로 트라이를 따로 만드는 게 편할 것 같다.




5번. 다리 건설하는 문제(?)

안 풀어서 정확히는 모르는데 구현문제이다. 그냥 하라는대로 구현하면 된다.



6번. 원형 벽에서 친구들이 출격해서 틈새를 매우는 문제

문제를 풀기에 앞서 몇 가지를 관찰하자.

먼저, 이동가능거리가 적은 친구랑 많은 친구 중에는 많은 친구를 사용하는 것이 무조건 이득이다.

또 시작점은 틈새가 있는 점만 따져보아도 충분하다.


이제 문제를 풀어보자. 이것도 모든 경우를 다 해볼 수 있을까?

경우의 수를 세어보면 최대 $_{15}P_8$이 되는데, 2.5억 정도이다.

시간제한이 안 써있어서 잘 몰랐는데 시간제한이 아마 10초였나보다. 즉, 구현만 잘 한다면 충분히 시간내에 돌아간다.


조금 더 빠른 방법은 없을까?

이 문제는 같은 subproblem을 여러 번 풀기 때문에, dp를 사용한다면 더 빠른 시간 내에 풀 수 있다.

dp[사용한 친구 수][cover되지 않은 애들을 bitmask로 표시]로 두고 푼다면 26만 개 정도의 state만 나온다.


아래 코드는 그냥 다 해보는 버전이다.




7번. 로봇청소기 문제

간단한 BFS 문제. 로봇이 가로 방향으로 있는 경우와 세로 방향으로 있는 경우 둘 다 표시해가면서, BFS만 하면 충분하다.

안타깝게 풀다가 시간 종료...



5번, 7번 문제와 6번 dp를 이용한 풀이는 추후에 문제가 올라오면 코드를 추가해야겠다.


'PS' 카테고리의 다른 글

SCPC 2020 Round 2  (0) 2020.09.07
2019 ACM-ICPC Seoul Regional 참가 후기  (3) 2019.11.14
문제 궤짝 만들기 외  (1) 2019.08.26
2019 UCPC 본선 // 마무리  (8) 2019.08.05
2019 SCPC 본선 후기  (1) 2019.08.02
Comments