코딩 테스트 문제 | [알고리즘] 카카오 코딩 테스트 #1 19844 좋은 평가 이 답변

당신은 주제를 찾고 있습니까 “코딩 테스트 문제 – [알고리즘] 카카오 코딩 테스트 #1“? 다음 카테고리의 웹사이트 ppa.maxfit.vn 에서 귀하의 모든 질문에 답변해 드립니다: https://ppa.maxfit.vn/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 빵굽는개발자 빵형 이(가) 작성한 기사에는 조회수 654,707회 및 좋아요 4,389개 개의 좋아요가 있습니다.

코딩 테스트 문제 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [알고리즘] 카카오 코딩 테스트 #1 – 코딩 테스트 문제 주제에 대한 세부정보를 참조하세요

네이버 카페에서 소통해요
http://cafe.naver.com/curiouscode
문제 출처 :
https://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/

코딩 테스트 문제 주제에 대한 자세한 내용은 여기를 참조하세요.

코딩테스트 연습 – 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 …

+ 여기를 클릭

Source: school.programmers.co.kr

Date Published: 11/20/2022

View: 3202

코딩테스트 문제 유형 정리 – velog

코딩테스트 문제 유형 정리 · 구현. 주어진 문제를 알고리즘을 통하여 코드로 바꾸는 것이다. · 수학 / 정렬. 수학공식, 문자열, 배열 & 리스트, 반복문, …

+ 여기에 보기

Source: velog.io

Date Published: 7/9/2022

View: 866

코딩 테스트 준비 – 문제

코딩 테스트 준비 – 문제. 최백준. 코딩 테스트에 주로 나오는 4개의 알고리즘 위주로 강의가 구성되어 있습니다. 시뮬레이션과 구현; 브루트 포스; 그래프와 BFS …

+ 여기에 보기

Source: code.plus

Date Published: 12/17/2022

View: 4521

나의 코딩테스트 취약점은 뭘까? 코테 보기 전에 꼭 읽고 가세요.

코딩테스트의 정의는 ‘주어진 시간동안 주어진 문제를 요구사항에 맞게, 프로그래밍하여 ACCEPT나 점수를 받는 시험’입니다. 그럼 정의에 맞게, 코딩테스트라는 시험 자체 …

+ 여기에 보기

Source: fastcampus.co.kr

Date Published: 11/2/2022

View: 9115

카카오 신입 공채 1차 코딩 테스트 문제 해설

아울러 이번 코딩 테스트는 대회가 아니라 채용을 위한 시험인 만큼 ACM-ICPC 같은 어려운 알고리즘 설계 능력을 겨루는 문제가 아닌 업무에서 있을만한 …

+ 여기에 더 보기

Source: tech.kakao.com

Date Published: 2/6/2022

View: 6961

코딩테스트 시작을 위한 백준 문제 추천 – Covenant

몇몇 코딩테스트 대비 방법을 설명한 유명한 글에서 알고리즘 문제를 추천하지만 생각보다 취준용으로 공감할 수 없는 문제도 많이 보였습니다. 8학기 …

+ 자세한 내용은 여기를 클릭하십시오

Source: covenant.tistory.com

Date Published: 11/24/2022

View: 1957

코딩테스트 연습하기 좋은 사이트 3곳 (Ft. 카카오) – 네이버 블로그

포트폴리오를 관리하고 알고리즘 문제를. 많이 풀어보면서 코딩테스트와 기술 면접을. 준비하라고 매 포스팅마다 얘기했습니다.

+ 여기에 표시

Source: m.blog.naver.com

Date Published: 2/30/2021

View: 8542

이제는 달라져야 하는 코딩 테스트 – 브런치

필자도 선발 과정에 직-간접적으로 참여하면서 코딩 테스트 문제를 출제하기도 했고 평가 과정에 참여하기도 했다. 개발자 역량 중에서 코드를 작성 …

+ 더 읽기

Source: brunch.co.kr

Date Published: 10/25/2021

View: 6061

주제와 관련된 이미지 코딩 테스트 문제

주제와 관련된 더 많은 사진을 참조하십시오 [알고리즘] 카카오 코딩 테스트 #1. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[알고리즘] 카카오 코딩 테스트 #1
[알고리즘] 카카오 코딩 테스트 #1

주제에 대한 기사 평가 코딩 테스트 문제

  • Author: 빵굽는개발자 빵형
  • Views: 조회수 654,707회
  • Likes: 좋아요 4,389개
  • Date Published: 2017. 12. 26.
  • Video Url link: https://www.youtube.com/watch?v=ExaatgwYqfU

나의 코딩테스트 취약점은 뭘까? 코테 보기 전에 꼭 읽고 가세요.

코딩테스트도 결국 프로그래밍입니다. 그러므로 시험에 임하는 개발자 입장에서 환경 체크는 절대 빠뜨려서는 안 되는 단계이죠. 가장 먼저 짚고 어떤 언어로 시험을 치를 것인가 결정해야 합니다. 코딩테스트에 가장 많이 활용하는 프로그래밍 언어는 다음과 같습니다.

– C++ : 비교적 문법이 어렵지만, 언어 자체의 속도가 빠르고 STL 등의 장점이 있다.

– PYTHON : 쉽고 간단한 문법으로 이루어져 배우기 쉽고 적용하기 좋다. 범용성이 넓다.

– JAVA : 비교적 문법이 어렵지만, 자바 개발자를 포함하여 필요로 하는 직군이 많아서 경쟁력 있는 선택이다

어떤 언어를 사용할 것인지는 개인에게 달려 있습니다. 가능하면 문제에 따라 언어를 바꿔 사용하는 것을 추천합니다. 재귀 깊이가 깊은 문제나 자료구조를 많이 활용해야 하는 문항에 대해서는 C++를 추천합니다. 반면, 정렬 이나 파싱 등 객체를 다루는 경우에는 파이썬이 적합합니다.

카카오 신입 공채 1차 코딩 테스트 문제 해설

‘블라인드’ 전형으로 실시되어 시작부터 엄청난 화제를 몰고 온 카카오 개발 신입 공채. 그 첫 번째 관문인 1차 코딩 테스트가 지난 9월 16일(토) 오후 2시부터 7시까지 장장 5시간 동안 온라인으로 치러졌습니다. 지원자들의 개발 능력을 잘 검증하기 위해 출제 위원들이 한 땀 한 땀 독창적이고 다양한 문제들을 만들어 냈고 문제에 이상은 없는지, 테스트케이스는 정확한지 풀어보고 또 풀어보며 만반의 준비를 기했습니다.

먼저, 가장 궁금해하실 1차 합격 기준부터 알려드립니다. 1차 합격 기준은 총 7 문제 중 4 문제 이상을 풀이한 분들입니다. 참고로 각 문제는 배점이 동일하므로 어떤 문제를 풀었던지 간에 관계는 없습니다.

문제는 쉬운 난이도에서 어려운 난이도 순으로 풀 수 있도록 차례대로 배치했는데요. 앞서 얘기했듯 모든 문제는 배점이 동일하며 부분 점수는 없습니다. 즉, 채점 테스트케이스를 하나만 틀려도 오답으로 처리가 됩니다. 하지만 입출력 예제에 대부분의 예외 사항을 포함했고 따라서 입출력 테스트를 정상적으로 통과했다면 채점도 무리 없이 통과할 수 있도록 구성했습니다. 아울러 이번 코딩 테스트는 대회가 아니라 채용을 위한 시험인 만큼 ACM-ICPC 같은 어려운 알고리즘 설계 능력을 겨루는 문제가 아닌 업무에서 있을만한 상황을 가정하여 독창적이고 다양한 분야의 문제를 출제했고, 난이도 또한 비교적 쉬운 수준으로 조정하였습니다. 일반적으로 자료구조, 알고리즘 등의 전산학 기초에 대해 충분히 학습하였다면 누구나 풀 수 있을만한 문제들로 구성했습니다.

언어별 통계

참가 언어별로는 자바가 전체의 43%로 가장 많았습니다. 그다음이 C++ 36%, 파이썬 11%, 자바스크립트 8% 순이었는데요. 스위프트는 0.7%의 참가자만이 선택하여 아직 스위프트가 주류로 성장하기엔 좀 더 시간이 필요해 보였습니다.

참가 언어: 자바 > C++ > 파이썬 > 자바스크립트 > 스위프트

4문제 이상을 풀이한 합격자의 비율은 C++이 25%로 가장 높았습니다. 그다음으로 파이썬이 24%로 근소한 차이로 뒤를 쫓고 있고, 참가자가 매우 적었던 스위프트도 20%로 합격률은 비교적 높았습니다. 그러나, 참가자가 가장 많았던 자바는 11%의 합격률 밖에 보여주지 못했으며 아쉽게도 자바스크립트의 경우 합격률이 9%에 불과했습니다.

합격 비율: C++ > 파이썬 > 스위프트 > 자바 > 자바스크립트

풀이한 언어의 평균 코드 라인 수를 알아볼까요?

C++이 평균적으로 가장 긴 라인 수를 자랑했습니다. 4번과 6번 문제는 78라인이나 필요했네요. 그다음은 근소한 차이로 자바입니다. 크게 차이가 나진 않지만 C++에 비해 평균적으로 5 ~ 6라인 정도가 짧았습니다. 그런데 재밌게도 가장 긴 코드는 자바가 차지했네요. 6번 문제의 경우 자바는 무려 80라인을 기록했습니다!

그다음은 자바스크립트입니다. 자바에 비해 10라인 이상이 짧습니다. 역시나 파이썬이 가장 짧은 라인 수를 기록했는데요. 1번 문제는 고작 22라인 밖에 필요하지 않았습니다. 게다가 가장 긴 코드가 필요했던 6번 문제도 48라인으로 자바의 60% 수준에 불과합니다.

코드 라인 수: C++ > 자바 > 자바스크립트 > 파이썬

이외에도 여러 언어를 섞어서 풀이한 분들이 전체의 5%나 되었으며, ‘C++ + 자바 + 자바스크립트 + 파이썬’ 이 4가지 언어를 동시에 섞어서 풀이한 분도 계셨네요.

긴 시간 동안 시험을 치르고, 문제를 풀이하느라 다들 고생 많이 하셨습니다.

자, 그렇다면 많은 분들이 궁금해하실 코딩 테스트 문제를 하나씩 짚어보도록 할까요?

문제 설명

1. 비밀 지도(난이도: 하)

네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.

지도는 한 변의 길이가 n 인 정사각형 배열 형태로, 각 칸은 “공백”(“ “) 또는 “벽”(“#”) 두 종류로 이루어져 있다. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 “지도 1”과 “지도 2”라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다. “지도 1”과 “지도 2”는 각각 정수 배열로 암호화되어 있다. 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1 , 공백 부분을 0 으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.

네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.

입력 형식

입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1 , arr2 가 들어온다.

1 ≦ n ≦ 16

≦ 16 arr1 , arr2 는 길이 n 인 정수 배열로 주어진다.

, 는 길이 인 정수 배열로 주어진다. 정수 배열의 각 원소 x 를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 2^n – 1을 만족한다.

출력 형식

원래의 비밀지도를 해독하여 “#” , 공백 으로 구성된 문자열 배열로 출력하라.

입출력 예제

매개변수 값 n 5 arr1 [9, 20, 28, 18, 11] arr2 [30, 1, 21, 17, 28] 출력 [“#####”,”# # #”, “### #”, “# ##”, “#####”]

매개변수 값 n 6 arr1 [46, 33, 33 ,22, 31, 50] arr2 [27 ,56, 19, 14, 14, 10] 출력 [“######”, “### #”, “## ##”, ” #### “, ” #####”, “### # “]

문제 해설

이 문제는 비트 연산Bitwise Operation을 묻는 문제입니다. 이미 문제 예시에 2진수로 처리하는 힌트가 포함되어 있고, 둘 중 하나가 1일 경우에 벽 # 이 생기기 때문에 OR로 처리하면 간단히 풀 수 있습니다. 아주 쉬운 문제였던 만큼 if else 로 풀이한 분들도 많이 발견되었는데요. 정답으로는 간주되지만 이 문제는 비트 연산을 잘 다룰 수 있는지를 묻고자 하는 의도였던 만큼 앞으로 이런 유형의 문제를 풀 때는 비트 연산을 꼭 기억하시기 바랍니다.

이 문제의 정답률은 81.78%입니다. 첫 번째 문제이고 가장 쉬운 문제였던 만큼 많은 분들이 잘 풀어주셨습니다.

2. 다트 게임(난이도: 하)

카카오톡에 뜬 네 번째 별! 심심할 땐? 카카오톡 게임별~

카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.

갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.

다트 게임은 총 3번의 기회로 구성된다. 각 기회마다 얻을 수 있는 점수는 0점에서 10점까지이다. 점수와 함께 Single( S ), Double( D ), Triple( T ) 영역이 존재하고 각 영역 당첨 시 점수에서 1제곱, 2제곱, 3제곱 (점수^1 , 점수^2 , 점수^3 )으로 계산된다. 옵션으로 스타상( * ) , 아차상( # )이 존재하며 스타상( * ) 당첨 시 해당 점수와 바로 전에 얻은 점수를 각 2배로 만든다. 아차상( # ) 당첨 시 해당 점수는 마이너스된다. 스타상( * )은 첫 번째 기회에서도 나올 수 있다. 이 경우 첫 번째 스타상( * )의 점수만 2배가 된다. (예제 4번 참고) 스타상( * )의 효과는 다른 스타상( * )의 효과와 중첩될 수 있다. 이 경우 중첩된 스타상( * ) 점수는 4배가 된다. (예제 4번 참고) 스타상( * )의 효과는 아차상( # )의 효과와 중첩될 수 있다. 이 경우 중첩된 아차상( # )의 점수는 -2배가 된다. (예제 5번 참고) Single( S ), Double( D ), Triple( T )은 점수마다 하나씩 존재한다. 스타상( * ), 아차상( # )은 점수마다 둘 중 하나만 존재할 수 있으며, 존재하지 않을 수도 있다.

0~10의 정수와 문자 S, D, T, *, # 로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.

입력 형식

“점수|보너스|[옵션]”으로 이루어진 문자열 3세트.

예) 1S2D*3T

점수는 0에서 10 사이의 정수이다.

보너스는 S, D, T 중 하나이다.

옵선은 * 이나 # 중 하나이며, 없을 수도 있다.

출력 형식

3번의 기회에서 얻은 점수 합계에 해당하는 정수값을 출력한다.

예) 37

입출력 예제

예제 dartResult answer 설명 1 1S2D*3T 37 1^1 * 2 + 2^2 * 2 + 3^3 2 1D2S#10S 9 1^2 + 2^1 * (-1) + 10^1 3 1D2S0T 3 1^2 + 2^1 + 0^3 4 1S*2T*3S 23 1^1 * 2 * 2 + 2^3 * 2 + 3^1 5 1D#2S*3S 5 1^2 * (-1) * 2 + 2^1 * 2 + 3^1 6 1T2D3D# -4 1^3 + 2^2 + 3^2 * (-1) 7 1D2S3T* 59 1^2 + 2^1 * 2 + 3^3 * 2

문제 해설

문자열 처리String Manipulation를 묻는 문제입니다. 앞에서부터 한 글자씩 잘라서 처리할 수 있고, 또는 간단한 컴파일러를 만들듯이 토큰화Tokenizing와 의미 분석Semantic Analysis을 통해 어렵지 않게 계산할 수 있습니다.

점수 중에는 한 자리뿐만 아니라 두 자리인 10점도 포함되어 있기 때문에 한 글자씩 잘라서 처리할때는 그 부분에 유의해야겠네요. 토큰화로 처리할 때는 정규식을 사용하면 비교적 쉽게 잘라낼 수 있습니다. S, D, T는 각각 원점수, 제곱, 세제곱으로 처리하고 스타상은 두 배로 계산하면 됩니다. 참, 아차상은 마이너스 점수라는 점에 유의하세요.

이 문제의 정답률은 73.47%입니다. 앞서 비밀지도 보다는 낮지만 그래도 많은 분들이 잘 풀어주셨습니다.

3. 캐시(난이도: 하)

지도개발팀에서 근무하는 제이지는 지도에서 도시 이름을 검색하면 해당 도시와 관련된 맛집 게시물들을 데이터베이스에서 읽어 보여주는 서비스를 개발하고 있다.

이 프로그램의 테스팅 업무를 담당하고 있는 어피치는 서비스를 오픈하기 전 각 로직에 대한 성능 측정을 수행하였는데, 제이지가 작성한 부분 중 데이터베이스에서 게시물을 가져오는 부분의 실행시간이 너무 오래 걸린다는 것을 알게 되었다.

어피치는 제이지에게 해당 로직을 개선하라고 닦달하기 시작하였고, 제이지는 DB 캐시를 적용하여 성능 개선을 시도하고 있지만 캐시 크기를 얼마로 해야 효율적인지 몰라 난감한 상황이다.

어피치에게 시달리는 제이지를 도와, DB 캐시를 적용할 때 캐시 크기에 따른 실행시간 측정 프로그램을 작성하시오.

입력 형식

캐시 크기( cacheSize )와 도시이름 배열( cities )을 입력받는다.

)와 도시이름 배열( )을 입력받는다. cacheSize 는 정수이며, 범위는 0 ≦ cacheSize ≦ 30 이다.

는 정수이며, 범위는 0 ≦ ≦ 30 이다. cities 는 도시 이름으로 이뤄진 문자열 배열로, 최대 도시 수는 100,000개이다.

는 도시 이름으로 이뤄진 문자열 배열로, 최대 도시 수는 100,000개이다. 각 도시 이름은 공백, 숫자, 특수문자 등이 없는 영문자로 구성되며, 대소문자 구분을 하지 않는다. 도시 이름은 최대 20자로 이루어져 있다.

출력 형식

입력된 도시이름 배열을 순서대로 처리할 때, “총 실행시간”을 출력한다.

조건

캐시 교체 알고리즘은 LRU (Least Recently Used)를 사용한다.

(Least Recently Used)를 사용한다. cache hit 일 경우 실행시간은 1 이다.

일 경우 실행시간은 이다. cache miss 일 경우 실행시간은 5 이다.

입출력 예제

캐시크기(cacheSize) 도시이름(cities) 실행시간 3 [“Jeju”, “Pangyo”, “Seoul”, “NewYork”, “LA”, “Jeju”, “Pangyo”, “Seoul”, “NewYork”, “LA”] 50 3 [“Jeju”, “Pangyo”, “Seoul”, “Jeju”, “Pangyo”, “Seoul”, “Jeju”, “Pangyo”, “Seoul”] 21 2 [“Jeju”, “Pangyo”, “Seoul”, “NewYork”, “LA”, “SanFrancisco”, “Seoul”, “Rome”, “Paris”, “Jeju”, “NewYork”, “Rome”] 60 5 [“Jeju”, “Pangyo”, “Seoul”, “NewYork”, “LA”, “SanFrancisco”, “Seoul”, “Rome”, “Paris”, “Jeju”, “NewYork”, “Rome”] 52 2 [“Jeju”, “Pangyo”, “NewYork”, “newyork”] 16 0 [“Jeju”, “Pangyo”, “Seoul”, “NewYork”, “LA”] 25

문제 해설

여기서부터 문제가 좀 어려워졌던 거 같습니다. 정답률이 많이 낮은데요. 이 문제는 ‘조건’에도 나와있지만 LRU 캐시 교체 알고리즘을 구현하는 문제이고, 이미 잘 알고 있다면 또는 검색해봤다면 잘 구현된 LRU 알고리즘 코드는 많이 찾을 수 있습니다.

단, 이 문제에는 입출력 예제에 캐시 사이즈 0이 포함되어 있습니다. 공개된 대부분의 LRU 구현 코드는 0일 때의 비정상적인 상황은 가정하지 않고 있기 때문에 생각 없이 그냥 가져와 붙인다면 에러가 나서 많이 고생했을 거 같네요. 하지만 사이즈 0을 처리하는 예외 처리 자체는 어렵지 않게 구현할 수 있으므로 입출력 예제가 왜 자꾸 틀리는지를 유심히 살펴봤다면 쉽게 풀 수 있는 문제입니다.

아울러 검색해서 가져온 코드는 반드시 사용 가능한지 라이선스를 확인하고, 가져올 때는 꼭 출처를 명시해야 한다는 점 잊지 마세요.

이 문제의 정답률은 45.26%입니다.

4. 셔틀버스(난이도: 중)

카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 ‘크루’라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.

이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.

셔틀은 09:00 부터 총 n 회 t 분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m 명의 승객이 탈 수 있다.

부터 총 회 분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 명의 승객이 탈 수 있다. 셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00 에 도착한 셔틀은 자리가 있다면 09:00 에 줄을 선 크루도 탈 수 있다.

일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라.

단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59 에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.

입력 형식

셔틀 운행 횟수 n , 셔틀 운행 간격 t , 한 셔틀에 탈 수 있는 최대 크루 수 m , 크루가 대기열에 도착하는 시각을 모은 배열 timetable 이 입력으로 주어진다.

0 < n ≦ 10

≦ 10 0 < t ≦ 60

≦ 60 0 < m ≦ 45

≦ 45 timetable 은 최소 길이 1이고 최대 길이 2000인 배열로, 하루 동안 크루가 대기열에 도착하는 시각이 HH:MM 형식으로 이루어져 있다.

은 최소 길이 1이고 최대 길이 2000인 배열로, 하루 동안 크루가 대기열에 도착하는 시각이 형식으로 이루어져 있다. 크루의 도착 시각 HH:MM 은 00:01 에서 23:59 사이이다.

출력 형식

콘이 무사히 셔틀을 타고 사무실로 갈 수 있는 제일 늦은 도착 시각을 출력한다. 도착 시각은 HH:MM 형식이며, 00:00 에서 23:59 사이의 값이 될 수 있다.

입출력 예제

n t m timetable answer 1 1 5 [“08:00”, “08:01”, “08:02”, “08:03”] “09:00” 2 10 2 [“09:10”, “09:09”, “08:00”] “09:09” 2 1 2 [“09:00”, “09:00”, “09:00”, “09:00”] “08:59” 1 1 5 [“00:01”, “00:01”, “00:01”, “00:01”, “00:01”] “00:00” 1 1 1 [“23:59”] “09:00” 10 60 45 [“23:59”,”23:59”, “23:59”, “23:59”, “23:59”, “23:59”, “23:59”, “23:59”, “23:59”, “23:59”, “23:59”, “23:59”, “23:59”, “23:59”, “23:59”, “23:59”] “18:00”

문제 해설

쉬워 보이는데 어려운 문제가 바로 이 문제였던 거 같네요. 당초 난이도를 ‘중’으로 두고 문제를 중간 즈음에 배치하였는데, 시간을 계산하는 부분에서 많은 분들이 어려워하셨던 거 같습니다.

예를 들어 2번 입출력 예제의 경우 [“09:10”, “09:09”, “08:00”] 인데 이 경우 두 번째 버스는 9:10분에 출발하기 때문에 9:10분에 오면 되지 않느냐 많이들 혼동하셨을 거 같아요. 하지만 9:00에 오는 버스는 8:00에 대기하는 크루 1명만 탑승할 수 있고, 따라서 9:10 버스에는 남아 있는 두 명이 모두 타게 됩니다. 따라서 좀 더 이른 9:09에 와야 탑승할 수 있습니다.

전체 계산은 어렵지 않지만 이처럼 정확하게 시간 계산을 해야 하는 부분이 많고 마지막 버스 시간까지 빈틈없이 계산해야 해서 많은 분들이 실수를 한 거 같습니다. 이 문제는 정답률이 두 번째로 낮은 26.79%입니다.

5. 뉴스 클러스터링(난이도: 중)

여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브는 사용자들이 편리하게 다양한 뉴스를 찾아볼 수 있도록 문제점을 개선하는 업무를 맡게 되었다.

개발의 방향을 잡기 위해 튜브는 우선 최근 화제가 되고 있는 “카카오 신입 개발자 공채” 관련 기사를 검색해보았다.

카카오 첫 공채..’블라인드’ 방식 채용

카카오, 합병 후 첫 공채.. 블라인드 전형으로 개발자 채용

카카오, 블라인드 전형으로 신입 개발자 공채

카카오 공채, 신입 개발자 코딩 능력만 본다

카카오, 신입 공채.. “코딩 실력만 본다”

카카오 “코딩 능력만으로 2018 신입 개발자 뽑는다”

기사의 제목을 기준으로 “블라인드 전형”에 주목하는 기사와 “코딩 테스트”에 주목하는 기사로 나뉘는 걸 발견했다. 튜브는 이들을 각각 묶어서 보여주면 카카오 공채 관련 기사를 찾아보는 사용자에게 유용할 듯싶었다.

유사한 기사를 묶는 기준을 정하기 위해서 논문과 자료를 조사하던 튜브는 “자카드 유사도”라는 방법을 찾아냈다.

자카드 유사도는 집합 간의 유사도를 검사하는 여러 방법 중의 하나로 알려져 있다. 두 집합 A , B 사이의 자카드 유사도 J(A, B) 는 두 집합의 교집합 크기를 두 집합의 합집합 크기로 나눈 값으로 정의된다.

예를 들어 집합 A = {1, 2, 3} , 집합 B = {2, 3, 4} 라고 할 때, 교집합 A ∩ B = {2, 3} , 합집합 A ∪ B = {1, 2, 3, 4} 이 되므로, 집합 A, B 사이의 자카드 유사도 J(A, B) = 2/4 = 0.5 가 된다. 집합 A와 집합 B가 모두 공집합일 경우에는 나눗셈이 정의되지 않으니 따로 J(A, B) = 1 로 정의한다.

자카드 유사도는 원소의 중복을 허용하는 다중집합에 대해서 확장할 수 있다. 다중집합 A는 원소 “1”을 3개 가지고 있고, 다중집합 B는 원소 “1”을 5개 가지고 있다고 하자. 이 다중집합의 교집합 A ∩ B 는 원소 “1”을 min(3, 5)인 3개, 합집합 A ∪ B 는 원소 “1”을 max(3, 5)인 5개 가지게 된다. 다중집합 A = {1, 1, 2, 2, 3} , 다중집합 B = {1, 2, 2, 4, 5} 라고 하면, 교집합 A ∩ B = {1, 2, 2} , 합집합 A ∪ B = {1, 1, 2, 2, 3, 4, 5} 가 되므로, 자카드 유사도 J(A, B) = 3/7 , 약 0.42 가 된다.

이를 이용하여 문자열 사이의 유사도를 계산하는데 이용할 수 있다. 문자열 “FRANCE”와 “FRENCH”가 주어졌을 때, 이를 두 글자씩 끊어서 다중집합을 만들 수 있다. 각각 {FR, RA, AN, NC, CE}, {FR, RE, EN, NC, CH}가 되며, 교집합은 {FR, NC}, 합집합은 {FR, RA, AN, NC, CE, RE, EN, CH}가 되므로, 두 문자열 사이의 자카드 유사도 J(“FRANCE”, “FRENCH”) = 2/8 = 0.25 가 된다.

입력 형식

입력으로는 str1 과 str2 의 두 문자열이 들어온다. 각 문자열의 길이는 2 이상, 1,000 이하이다.

과 의 두 문자열이 들어온다. 각 문자열의 길이는 2 이상, 1,000 이하이다. 입력으로 들어온 문자열은 두 글자씩 끊어서 다중집합의 원소로 만든다. 이때 영문자로 된 글자 쌍만 유효하고, 기타 공백이나 숫자, 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다. 예를 들어 “ab+”가 입력으로 들어오면, “ab”만 다중집합의 원소로 삼고, “b+”는 버린다.

다중집합 원소 사이를 비교할 때, 대문자와 소문자의 차이는 무시한다. “AB”와 “Ab”, “ab”는 같은 원소로 취급한다.

출력 형식

입력으로 들어온 두 문자열의 자카드 유사도를 출력한다. 유사도 값은 0에서 1 사이의 실수이므로, 이를 다루기 쉽도록 65536을 곱한 후에 소수점 아래를 버리고 정수부만 출력한다.

예제 입출력

str1 str2 answer FRANCE french 16384 handshake shake hands 65536 aa1+aa2 AAAA12 43690 E=M*C^2 e=m*c^2 65536

문제 해설

이 문제는 자카드 유사도를 설명해주고 자카드 유사도를 직접 계산하는 프로그램을 작성하는 문제입니다. 자카드 유사도는 실무에서도 유사한 문서를 판별할 때 주로 쓰이는데요, 몰랐더라도 문제에서 자세히 설명해주기 때문에 이해하는데 어려움은 없었을 거 같습니다. 공식은 매우 간단한데요, 교집합을 합집합으로 나눈 수입니다. 다만, 이 값은 0에서 1 사이의 실수가 되는데, 여기서는 이를 다루기 쉽도록 65536을 곱한 후 소수점 아래를 버리고 정수부만 취하도록 합니다.

문제 설명은 원소의 중복을 허용하는 다중집합multiset으로 되어 있는데, 자주 접하는 자료구조가 아니고, 일부 언어에서는 기본으로 제공하는 자료구조가 아니라 어려워하는 분들이 있었습니다. 하지만 다중집합 자료구조를 쓰지 않더라도, 각 원소를 정렬된 배열에 넣은 후 병합 정렬Merge sort에서 배웠던 코드를 응용, 어렵지 않게 합집합과 교집합 함수를 직접 구현할 수도 있습니다.

다중집합의 교집합, 합집합만 잘 구해낸다면 이 문제는 어렵지 않게 풀 수 있으며, 다만 집합 A와 B가 모두 공집합일 경우에는 나눗셈이 정의되지 않으므로division by zero 따로 J(A,B) = 1 로 정의합니다. 즉, 65536을 곱하면 이 경우 1 * 65536 = 65536 이 정답이 됩니다. 예제 입출력에도 합집합이 공집합인 경우가 포함되어 있으므로 이 경우만 주의한다면 쉽게 풀 수 있는 문제입니다.

이 문제의 정답률은 41.84%입니다.

6. 프렌즈4블록(난이도: 상)

블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 “프렌즈4블록”.

같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.

만약 판이 위와 같이 주어질 경우, 라이언이 2×2로 배치된 7개 블록과 콘이 2×2로 배치된 4개 블록이 지워진다. 같은 블록은 여러 2×2에 포함될 수 있으며, 지워지는 조건에 만족하는 2×2 모양이 여러 개 있다면 한꺼번에 지워진다.

블록이 지워진 후에 위에 있는 블록이 아래로 떨어져 빈 공간을 채우게 된다.

만약 빈 공간을 채운 후에 다시 2×2 형태로 같은 모양의 블록이 모이면 다시 지워지고 떨어지고를 반복하게 된다.

위 초기 배치를 문자로 표시하면 아래와 같다.

TTTANT RRFACC RRRFCC TRRRAA TTMMMF TMMTTJ

각 문자는 라이언(R), 무지(M), 어피치(A), 프로도(F), 네오(N), 튜브(T), 제이지(J), 콘(C)을 의미한다

입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.

입력 형식

입력으로 판의 높이 m , 폭 n 과 판의 배치 정보 board 가 들어온다.

, 폭 과 판의 배치 정보 가 들어온다. 2 ≦ n , m ≦ 30

, ≦ 30 board 는 길이 n 인 문자열 m 개의 배열로 주어진다. 블록을 나타내는 문자는 대문자 A에서 Z가 사용된다.

출력 형식

입력으로 주어진 판 정보를 가지고 몇 개의 블록이 지워질지 출력하라.

입출력 예제

m n board answer 4 5 [“CCBDE”, “AAADE”, “AAABF”, “CCBBF”] 14 6 6 [“TTTANT”, “RRFACC”, “RRRFCC”, “TRRRAA”, “TTMMMF”, “TMMTTJ”] 15

예제에 대한 설명

입출력 예제 1의 경우, 첫 번째에는 A 블록 6개가 지워지고, 두 번째에는 B 블록 4개와 C 블록 4개가 지워져, 모두 14개의 블록이 지워진다.

입출력 예제 2는 본문 설명에 있는 그림을 옮긴 것이다. 11개와 4개의 블록이 차례로 지워지며, 모두 15개의 블록이 지워진다.

문제 해설

게임 요구 사항을 구현해보는 문제입니다. 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임인데요. 인접한 모든 블록이 사라지는 실제 게임들과 달리 계산을 쉽게 하기 위해 2×2로 제한하고, 사라진 블록 자리에는 새로운 블록이 채워지지 않습니다. 그럼에도 불구하고 인접한 블록을 모두 스캔해야 하는 문제라 짧지 않은 코드가 필요했을 것 같네요. 이번 시험에서 가장 긴 코드가 필요한 문제였습니다. 자바의 경우 무려 80라인이나 필요했네요. 블록 매트릭스를 생성하여 스캔하고 제거해 나가는 작업을 반복하면서 더 이상 제거되지 않을 때 사라진 블록 자리의 수를 계산하면 됩니다.

이 문제의 정답률은 48.01%입니다.

7. 추석 트래픽(난이도: 상)

이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다.

입력 형식

solution 함수에 전달되는 lines 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다.

함수에 전달되는 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다. 응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이 2016-09-15 hh:mm:ss.sss 형식으로 되어 있다.

형식으로 되어 있다. 처리시간 T는 0.1s , 0.312s , 2s 와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는 s 로 끝난다.

, , 와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는 로 끝난다. 예를 들어, 로그 문자열 2016-09-15 03:10:33.020 0.011s 은 “2016년 9월 15일 오전 3시 10분 33.010초”부터 “2016년 9월 15일 오전 3시 10분 33.020초”까지 “0.011초” 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝시간을 포함)

은 “2016년 9월 15일 오전 3시 10분 33.010초”부터 “2016년 9월 15일 오전 3시 10분 33.020초”까지 “0.011초” 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝시간을 포함) 서버에는 타임아웃이 3초로 적용되어 있기 때문에 처리시간은 0.001 ≦ T ≦ 3.000이다.

lines 배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.

출력 형식

solution 함수에서는 로그 데이터 lines 배열에 대해 초당 최대 처리량을 리턴한다.

입출력 예제

예제 1

입력: [ “2016-09-15 01:00:04.001 2.0s”, “2016-09-15 01:00:07.000 2s” ]

출력: 1

예제 2

입력: [ “2016-09-15 01:00:04.002 2.0s”, “2016-09-15 01:00:07.000 2s” ]

출력: 2

설명: 처리시간은 시작시간과 끝시간을 포함하므로 첫 번째 로그는 01:00:02.003 ~ 01:00:04.002 에서 2초 동안 처리되었으며, 두 번째 로그는 01:00:05.001 ~ 01:00:07.000 에서 2초 동안 처리된다. 따라서, 첫 번째 로그가 끝나는 시점과 두 번째 로그가 시작하는 시점의 구간인 01:00:04.002 ~ 01:00:05.001 1초 동안 최대 2개가 된다.

예제 3

입력: [ “2016-09-15 20:59:57.421 0.351s”, “2016-09-15 20:59:58.233 1.181s”, “2016-09-15 20:59:58.299 0.8s”, “2016-09-15 20:59:58.688 1.041s”, “2016-09-15 20:59:59.591 1.412s”, “2016-09-15 21:00:00.464 1.466s”, “2016-09-15 21:00:00.741 1.581s”, “2016-09-15 21:00:00.748 2.31s”, “2016-09-15 21:00:00.966 0.381s”, “2016-09-15 21:00:02.066 2.62s” ]

출력: 7

설명: 아래 타임라인 그림에서 빨간색으로 표시된 1초 각 구간의 처리량을 구해보면 (1) 은 4개, (2) 는 7개, (3) 는 2개임을 알 수 있다. 따라서 초당 최대 처리량은 7이 되며, 동일한 최대 처리량을 갖는 1초 구간은 여러 개 존재할 수 있으므로 이 문제에서는 구간이 아닌 개수만 출력한다.

문제 해설

이번 테스트의 마지막 문제이고, 가장 어려운 문제입니다. 초당 최대 처리량이 되는 구간 윈도우를 찾아야 하는 문제인데요. 당연히 처음부터 끝까지 스캔하기에는 범위가 너무 크고, 게다가 ms 단위로 되어 있기 때문에 첫 로그 시각부터 마지막 로그 시각까지 1ms씩 증가시키면서 1000ms 단위의 슬라이딩 윈도우로 풀면 24 * 3600 * 1000 * n * 1000ms 만큼의 연산이 필요하기 때문에 이렇게는 풀 수가 없습니다.

그렇다고 각 로그의 시작 시각부터 마지막 시각까지 1ms 씩 움직이면 time(ms) * n^2 이 되며, time(ms)의 값은 대부분 천 단위 이상이기 때문에 마찬가지로 타임아웃이 발생하여 풀 수가 없습니다. 그런데 자세히 살펴보면 요청량이 변하는 순간은 각 로그의 시작과 끝뿐임을 알 수 있습니다. 따라서, 각 로그 별 2번의 비교 연산만 수행하면 되며 2 * n^2 , 빅오로 정리하면 O(n^2) 에 풀 수가 있습니다. 빅오에서 제거된 상수항도 매우 작기 때문에 이 경우 무리 없이 문제를 풀 수 있게 되며 C++ 기준으로 10ms를 넘지 않습니다.

물론, 이 문제는 윈도우를 사용하지 않고도 풀 수 있는 방법이 있습니다. 효율적인 알고리즘을 쓴다면, O(n log n) 으로 풀 수 있는 방법도 있으니 한 번 고민해보세요. 이 문제는 가장 어려운 문제였던 만큼 정답률은 가장 낮은 17.99%입니다.

마무리하며

이렇게 모든 문제를 돌아보고 간략한 해설을 곁들여 봤습니다. 어떠신가요?

참여하신 분들 중 미처 풀지 못한 문제가 있었다면 문제 해설을 보면서 ‘조금만 더 시간이 있었더라면…‘라며 안타까움을 느끼는 분들이 많으실 거라 생각합니다. 여타의 코딩 대회와 달리 채용을 위한 시험인 만큼 재밌게 즐기기는 힘들었을 것입니다. 하지만, “천재는 노력하는 사람을 이길 수 없고, 노력하는 사람은 즐기는 사람을 이길 수 없다.”는 말이 있듯이, 끝까지 즐기는 마음 잊지 않고 코딩을 즐긴다면 언젠가 좋은 결과 있으리라 확신합니다. 마지막까지 잘 마무리하여 꼭 카카오에서 여러분들을 만나 뵙게 되길 기대하겠습니다.

그럼, 2차 시험에서 다시 만나도록 할게요. 마지막까지 파이팅!

코딩테스트 시작을 위한 백준 문제 추천

코딩테스트 시작을위한 백준문제 추천

시작하며

본 글은 코딩테스트를 시작하는 분들을 위한 글입니다. 올해 초 코딩테스트 대비를 위한 백준 문제 추천글을 작성하였습니다. 본 글은 어느정도 알고리즘 공부가 된 전공 4학년이 빠르게 코딩테스트 대비를 하기 위해서 실전에 나올법한(실제로 나왔던)스타일의 어느정도 난이도 있는 문제들을 추천하는 글을 작성했습니다. 본 글을 읽고 취업 준비를 일찍 하고 싶어하는 대학교 2, 3학년 그리고 알고리즘 공부를 이제 막 시작하는 막막한 취업 준비생들에게서 어떤 문제를 풀어야하는지 모르겠다는 요청을 받았습니다. 몇몇 코딩테스트 대비 방법을 설명한 유명한 글에서 알고리즘 문제를 추천하지만 생각보다 취준용으로 공감할 수 없는 문제도 많이 보였습니다. 8학기 뒤늦게 코딩테스트 공부를 시작해서 20번의 코딩테스트를 보았던 경험을 살려 코딩테스트를 이제 막 시작하는 분들 에게, 취업이라는 장애물을 넘고 싶지만 코딩테스트가 막막한 분들을 위해 최적의 문제를 추천해드립니다.

📣 공지: 코딩테스트 완벽 정복 로드맵 공개!

기초

인터넷에 코딩테스트 준비를 위해서 검색해보면 백준 사이트를 추천해줍니다. 그래서 백준 사이트에 접속했더니 반겨주는 것은 수 많은 문제들. 이 중에서 어떤 문제를 풀어야할지 막막할 것입니다. 현재 글에서 코딩테스트 공부 시작을 위한 백준 문제를 추천해드립니다. 코딩테스트를 통과하고 1차 면접에서 제출한 코딩테스트를 리뷰하기 때문에 파이썬으로 코딩테스트를 준비한다면 코딩테스트에 최적화된 Pythonic한 코드를 작성해야합니다. 용감하게 시작하는 코딩테스트를 참고하세요!

도약

코딩테스트가 어려운 회사에 도전한다면 코딩테스트 대비를 위한 백준 문제 추천를 꼭 풀어봐야합니다. 실제 시험에서 만날 수 있는 챌린지한 문제를 넣었습니다. 주제별 학습으로 코딩테스트에 빈출되는 주제와 뼈대 문제를 담았습니다. 특정 주제에 약하다면 꼭 뼈대문제부터 다져보세요.

특히 제가 쓴 dfs, bfs 글은 Google 첫 번째에 올라와있는 구글 알고리즘이 선택한 양질의 글입니다.

실전

코딩테스트 고득점 Kit는 기업 코딩테스트를 보고 제일 유사한 난이도, 아이디어를 사용한 문제를 모아둔 것입니다. 가장 실전과 유사한 난이도이며 많은 분들의 공감을 받아 현재도 높은 조회수를 기록하고 있습니다. DFS, BFS 문제는 꾸준히 코딩테스트에 출제됩니다. 시험전에 기초부터 다소 까다로운 문제까지 연습할 수 있도록 문제와 풀이를 담았습니다.

무엇을 공부할 것인가?

취업을 위한 코딩테스트 대비 글을 검색하면 ‘완전 탐색 중심으로 공부해라’, ‘하나의 알고리즘 주에의 문제를 50문제 이상 풀어봐라’ 등등의 글들을 봅니다. 그러나 최근 2년간 출제되었던 알고리즘 주제를 확인해보세요.

회사 알고리즘 네이버(2020 하반기) 구현, 시뮬레이션, BFS, DP, 완전탐색 삼성(2020 하반기) BFS, 시뮬레이션 삼성(2020 상반기) BFS, 시뮬레이션 카카오(2021 블라인드 1차) 투포인터, 완전탐색, DP, 트라이, 파싱, 최단경로, 이분탐색 카카오(2020 하반기) 구현, 문자열 카카오(2020 블라인드) 문자열, 재귀, 탐색, 트라이, 구현, 완전탐색, BFS 카카오(2020 카카오 인턴십) 구현, 완전탐색, 투포인터, BFS, DFS, 트리, 유니온파인드 카카오(2019 블라인드) 배열, 해싱, map, 정렬, 조합, DFS, 정렬, 시뮬레이션, 트리 순회, 구현 카카오(2019 카카오 개발자 겨울 인터십) BFS, 세그먼트 트리, 완전탐색, 자료구조, 다익스트라 카카오(2018 블라인드 3차) 구현, 정렬,문자열,트라이 카카오(2018 블라인드 1차) Bitwise, 문자열, 구현, 정렬, 시뮬레이션, 스케쥴링 라인(2020 하반기) 구현, 문자열, 시뮬레이션, 덱 라인(2019 상반기) 구현, BFS, DFS, DP NHN(2020 하반기) 모노톤 스택, 그래프 NHN(2019 1차 면접) 플러드 필 NHN(2019 코테) 구현, 시뮬레이션 NHN(2018 1차 면접) Trie, 비트마스킹 NHN(2018 코테) 구현, 시뮬레이션 모비스(2019) DFS, DP 신한(2020 상반기) BFS, 시뮬레이션 신한(2020 하반기) 유니온파인드, 문자열, 우선순위큐, 완전탐색, [SQL] 쿠팡(2020) 정렬, 위상정렬, 트리DP, 해싱(Map) 현대 오토에버 문자열, DP, 순열조합 SK C&C Heap, 구현, 순열, BFS 파수 트리, 조합, 파싱, 구현

완전 탐색 문제가 자주 나오는 것은 사실입니다. 그러나 완전탐색만 파서는 코딩테스트 관문을 넘을 수 없습니다. 하나의 주제를 50문제 이상 풀었다간 800문제는 족히 풀어야할 것입니다. 백준에서 800문제 이상 풀면 랭킹 1000위 안에 듭니다. 역대 컴공 졸업자가 1000명은 족히 넘을테니 이정도 이상 풀 필요는 없어 보이긴합니다.

공부해야할 주제

⭐⭐⭐ 구현

⭐⭐⭐ 자료구조: 우선순위 큐, 스택, 트리

⭐ 순열조합 활용

⭐ 진법

⭐⭐⭐ DFS, BFS

⭐⭐⭐ 투포인터

⭐⭐⭐ 최단거리

⭐⭐ 브루트포스

⭐⭐ 다이나믹 프로그래밍

⭐⭐ 시뮬레이션

⭐ Union Find

⭐⭐⭐ 문자열(정규식, 조작, 탐색)

⭐⭐⭐ 이분탐색

Trie

Flood fill

미트 마스킹

위상정렬

세그먼트 트리

어떤 회사도 코딩테스트에 어떤 주제가 나오는지 않습니다. 할수 있는 것은 지금까지 출제되었던 알고리즘 주제 중에서 역으로 무엇이 자주 나왔는지 살펴보는 수밖에 없습니다. 제가 중요하다고 생각하는 주제에 대해서 ⭐을 남겨 보았습니다. 처음 공부를 시작하시거나 빠르게 준비해야 하는 분들은 ⭐를 중심으로 준비하시면 됩니다.

코딩테스트 시작을 위한 문제 추천

시작하는 분들을 위한 문제 추천입니다. 쉽다면 바로바로 다음 난이도의 문제로 넘어가면 됩니다. 백준 난이도는 solved.ac를 따릅니다.

시작 & 구현

스택 / 큐

그래프 탐색

투포인터

코딩테스트 연습하기 좋은 사이트 3곳 (Ft. 카카오)

프로그래머스는 제가 가장 애용하는 곳입니다

코테의, 코테에 의한, 코테를 위한 곳이죠

C언어, C++, C#, Go, 자바, J/S, 코틀린

파이썬, 루비, 스칼라, 스위프트, MySQL, Oracle 등

다양한 프로그래밍 언어와 SQL을 지원하며

카카오 코딩테스트 문제가 수록된 곳으로 유명합니다

체감상 백준보다 난이도가 높은 편이고요

코딩테스트뿐만 아니라 유희를 목적으로

고난도 문제도 수록돼있으니

프로그래밍 괴물들이 좋아할만 합니다

알고리즘문제 뿐만 아니라

각종 개발자 채용공고도 정리돼 올라오는 곳이죠

내가 취업을 위해 무슨 공부를 해야할지 모르겠다면

채용 공고를 자주 확인해서

기업들이 원하는 기술 스택을 확인하라고

종종 말씀드렸는데요

프로그래머스는 개발자를 위한 곳이기 때문에

채용 공고 역시 간결하고 핵심만 담겨있습니다

이제는 달라져야 하는 코딩 테스트

이제 IT 기업에서 소프트웨어 개발자를 뽑기 위해서 코딩 테스트를 보는 것이 당연한 시대가 되었다. 필자도 선발 과정에 직-간접적으로 참여하면서 코딩 테스트 문제를 출제하기도 했고 평가 과정에 참여하기도 했다. 개발자 역량 중에서 코드를 작성하는 역량이 중요하다는 것은 누구나 동의할 것이다. 그렇지만 오직 코딩 테스트만 잘하는 것을 바라지는 않는다.

이제 코딩 테스트 서비스와 플랫폼들이 대중화되면서 누구나 웹 사이트에서 코드를 작성하고, 즉시 테스트 결과를 확인할 수 있다. 회사들은 코딩 테스트 과정에서 점수로 나오는 평가의 편리함 덕분에 대규모 인원을 평가할 수 있다. 그렇지만 지원자 입장에서도, 회사 입장에서 대부분 코딩 테스트는 아쉬운 부분이 많다.

1. 테스트를 통과하는 정답만 있다고 믿는다

코딩 테스트는 입력에 따라 출력이 나오는 테스트 케이스를 통과하는지 확인하는 시험이다. 대부분 코딩 테스트 플랫폼들은 미리 준비해 놓은 테스트를 통과했는지 점수화해서 결과로 알려준다. 응시자들은 주어진 시간이 촉박하기 때문에 자연스럽게 테스트를 통과하는 데 집중하고, 테스트를 통과하는 그 코드가 정답이라고 믿는다.

테스트 케이스 통과와 함께 공간 복잡도, 시간 복잡도를 통과 조건으로 두기도 하는데 이런 경우는 알고리즘과 구현 방식까지 거의 정해주는 셈이다. 그러다 보니 이런 문제는 저런 방식으로 작성한다는 공식을 외워서 코드를 작성한다.

요즘 대학생들은 알고리즘 스터디를 많이 한다. 학교에서 외부 강사를 초대해서 특강으로 출제 유형을 분석하거나 족집게 강의를 해주기도 한다. 스스로 생각하는 과정을 알려주는 게 아니라, 문제 유형을 분석해서 특정 알고리즘으로 풀면 된다고 암기한다.

최근 코딩 테스트 결과를 보면 점수가 우상향 되어 있는 편이다. 그만큼 짧은 시간 동안 정답이 있는 시험을 잘 보기 위한 준비를 했기 때문이다.

필자가 생각하는 코딩 테스트의 오류는 바로 이 부분에서 시작한다. 개발자들이 해결해야 하는 문제들은 정답이 정해진 문제만 있지 않다. 추상적인 요구사항을 여러 단계로 나누고, 단계에 필요한 문제를 정의하는 것부터가 소프트웨어 개발의 시작이다. 정답이 정해진 문제만 답을 외워서 해결했기 때문에, 스스로 문제를 정의하지 못하고 큰 그림을 이해하지 못한다. 작은 문제를 해결하는 역량도 필요하지만, 그게 전부가 아니다. 마치 백일장처럼 같은 주제에 대해 다양한 문제의식에서 시작해서, 그 생각을 적절하게 기술적으로 표현한 코드를 볼 수 있어야 한다. 하지만 코딩 테스트는 정해진 정답을 찾은 사람만 골라내는 시험이 되어가고 있다.

2. 빨리 결과를 만드는 데만 집중한다

대부분 코딩 테스트는 비교적 짧은 시간에 여러 문제를 풀도록 강제한다. 어떤 회사는 5-6문제를 3시간 이내에 풀도록 하기도 한다. 시간이 넉넉하지 않다는 핑계는 정답만 찾는 좋은 이유가 된다. 그러면서 빠르게 결과를 만드는 데 집중하게 만든다. 이런 조건에서는 과정보다는 결과에 무게 중심을 두게 된다.

개발 과정을 살펴보면 소위 삽질이라고 표현하는 과정이 필요하다. 문제 해결을 위해 가설을 세우고, 가설이 맞는지 시도하고, 결과를 확인해서 가설을 검증하는 과정이다. 코딩 테스트하면서도 이런 과정이 반복된다. 그렇지만 결과만 지향하다 보면 그 과정이 덜 중요하다고 생각하게 된다. 그러면 과정을 단축시키기 위해서 의도적으로 해야만 하는 다양한 사고 실험이 생략되거나 전략적으로 정답이라고 생각하는 방식으로 시야가 좁아진다.

채용 과정에서 코딩 테스트 이외에 다른 단계에서 결과가 아니라 과정을 보는 단계를 두기도 한다. 온사이트 인터뷰에서 화이트보드에 코드를 설명하는 단계를 두는 이유는 바로 문제 해결 과정을 살펴보기 위해서다. 채점 결과로 나오는 코딩 테스트로는 과정을 평가하기 어렵기 때문에 그것을 보완하는 단계가 있어야 한다.

3. 코드 품질이 나빠진다

테스트 케이스를 통과시키기 위해서 제한된 시간 내에 코드를 작성하다 보면 코드 품질은 나빠진다. 어뷰징을 막기 위해서 복사-붙여 넣기를 금지하면 컴파일 에러라도 확인하기 위해서 통합 개발 환경에서 우선 작성하고 나서 코딩 테스트 플랫폼에 다시 입력하는 과정을 거친다. 두 번이나 입력해야 하다 보니 변수명, 함수명을 생각할 시간조차 부족하다. 결과적으로 코드 품질이 나빠진다.

제한된 시간 내에 코드를 작성하다 보면 누구나 깊은 고민이나 생각을 하지 못하고, 의식의 흐름대로 작성하는 경우가 많다. 어차피 사람이 읽고 고칠 코드가 아니라 시험 볼 때 기계가 실행하고 나면 사라질 코드니까 신경 써서 클린 코드로 작성할 필요는 없다. 하지만 코드 품질을 완전히 무시하고 결과 지향적인 코드를 작성하는 것은 단지 시험을 위한 비현실적인 코드가 된다. 임시로 작성하고 버려질 코드는 그래도 상관없지만, 그런 코드만 작성하는 경험을 반복하는 것은 나쁜 습관이 된다. 계속해서 그런 코드만 작성했던 사람들은 코드 품질을 신경 써야 하는 경우에도 나쁜 습관에서 벗어나지 못한다.

4. 피드백 연결 고리가 끊어져서 개선하지 않는다

앞서 말한 것처럼 코딩 테스트만 반복해서 연습하다 보면 시야가 좁아지고, 코드 품질도 나빠질 수 있다. 더 좋지 않은 것은 그렇게 초집중해서 해결한 코드는 제출하고 나면 피드백을 주는 사람도 없고 개선할 필요성을 느끼지 못하기 때문에 버려진다. 테스트 동안 작성한 코드는 주어진 조건 내에서 주어진 테스트 케이스는 통과할 수 있지만, 그 이외에 조건이나 환경에서는 다른 영향을 줄 수도 있다. 테스트 케이스에 포함되지 않은 오류는 검증할 수 없기 때문이다.

이렇게 임시로 주어진 조건에서만 동작하도록 만들고 버려지는 코드도 있을 수 있다. 그것을 부정하는 게 아니라, 그런 코드도 있지만 한 번 만들고 나면 쉽게 버려지지 않은 코드도 있다는 것이다. 응시자는 시험이 끝나고 코드를 보관하고 있다가 다른 방식으로 해결해 볼 수도 있고, 문제의 제약 사항을 바꿔서 다른 관점에서 해결하는 방법도 좋다. 회사 입장에서는 코딩 테스트 외에 이미 만들어진 레거시 코드를 개선하거나, 개선한 코드가 다른 코드에 영향을 주는지 확인하고, 리팩터링으로 결과는 갖지만 구조를 바꾸기 위해서 피드백 고리를 만들기를 권장한다. 그래야 단지 코드가 아니라 사고의 과정을 함께 살펴볼 수 있다.

5. 어려운 문제 점수가 실력을 의미하지 못한다

여러 회사가 코딩 테스트를 보면서, 응시하는 사람들도 점점 점수가 높아진다. 그러면 회사는 점수만으로 변별할 수 있도록 더 제약 사항을 추가하고 더 어려운 문제를 출제한다. 최근 몇 년 동안 코딩 테스트는 악순환이 반복되고 있다. 그럼에도 응시자들은 문제 유형을 분석하고 정답을 외워서 코딩 테스트 만점을 받는 경우가 많아졌다. 다양한 사고의 흐름을 확인하려는 코딩 테스트가 단순한 암기 시험으로 변질되고 있다.

코딩 테스트에서 어려운 문제들은 현실적인 문제가 추상적으로 표현돼서 해결 방법을 찾기 어렵거나 특정한 알고리즘 방식으로 정교하게 구현하지 않으면 안 되는 문제들이다. 마치 불수능에 나올 법한 난해한 전문 분야의 지문을 읽고 척척 알아맞히길 바라는 문제일지도 모른다. 필자는 그런 문제를 반대한다. 솔직히 그런 문제를 풀어야만 한다고 납득이 되지 않는다. 그 문제를 꼭 풀어야 하는 포지션이나 업무가 따로 있을 수도 있지만 모든 개발자들이 다 어려운 문제를 풀 수 있어야만 하는 것은 아니다.

6. 선별의 수단이 목적이 된다

코딩 테스트를 하는 근본적인 목적이 무엇인가 다시 되짚어 봐야 한다. 코딩 테스트는 복잡하고 어렵고 정교한 알고리즘을 몰라서 못 푸는 문제보다는, 보편적으로 누구나 알 수 있는 최소한의 수준을 검증하는 것을 목표로 해야 한다. 주어진 조건에 맞춰서 동작하는 함수를 구현할 수 있고, 적절한 타입을 활용해서 메모리를 적절한 범위로 사용하도록 구현할 수 있으면 된다. 코딩 테스트는 최상을 뽑는 게 아니라, 최하를 걸러내는 선별의 수단이 되어야 한다.

요즘 알고리즘 문제 사이트에서 진행하는 맹목적인 문제 풀이와 회사들이 채용 과정에서 제시하는 코딩 테스트 문제들은 선별의 수단이 아니라 그 자체가 목적이 되어버렸다. 스스로 생각하는 방법을 잃어버리는 시험에 반복적으로 노출되는 상황이 안타깝다.

7. 코딩 테스트 점수와 직무 역량의 상관관계가 낮다

심지어 현업에 있는 대부분 지인들은 코딩 테스트 점수와 업무 역량이 크게 상관관계가 없다고 말한다. 어려운 코딩 테스트 문제를 술술 풀고, 칠판에도 어떻게 풀었는지 설명할 수 있는 분에게 업무 요구사항을 주면 어디서부터 시작할지 모르는 경우가 많다. 마치 오래전에 토익-토플 만점자가 외국인과 대화를 못하거나, 업무를 할 정도가 못된다는 도시괴담과 비슷해졌다.

제한적인 상황에서 동작하는 예외적인 문제를 푸는 코딩 테스트는 아쉽게도 선발 과정에서 점수 데이터를 얻기 위한 편리한 채용 업무 수단으로 전락했다. 이미 회사들이 최근 몇 년 동안 잘못된 방향으로 신호를 보냈고, 계속해서 그쪽으로만 가고 있다. 지금이라도 코딩 테스트 이외에 실무진이 직접 확인할 수 있는 다양한 방법을 찾아야 한다. 자신의 동료를 구하려면 같이 일 할 팀원들 모두가 채용 과정 시작부터 적극적으로 소통하고 검증해야 하는 시대가 됐다.

최근에는 코딩 테스트 허들을 낮추고, 과제형으로 문제를 제시하고 일정 기간 동안 해결한 내용을 온라인에서 또는 온사이트에서 확인하는 기업들도 늘어났다. 이런 시도는 채용이 소규모일 때 가능하고 일정 규모 이상 진행하기 어렵다. 확장성이 없고 지속 가능하지는 않기 때문이다.

적어도 앞으로 과도한 코딩 테스트만으로 선발하지 않기를 바라는 마음에서 정리해봤다. 선발 과정을 단순하게 처리할수록 놓치는 부분이 많고, 그 분야만 잘하는 사람을 뽑게 된다. 개발자 뽑기 어려운 시대일수록, 그 사람을 더 알 수 있는 방법을 고민했으면 좋겠다.

키워드에 대한 정보 코딩 테스트 문제

다음은 Bing에서 코딩 테스트 문제 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [알고리즘] 카카오 코딩 테스트 #1

  • 알고리즘
  • 카카오코딩
  • 카카오코딩테스트
  • 코딩테스트
[알고리즘] #카카오 #코딩 #테스트 ##1


YouTube에서 코딩 테스트 문제 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [알고리즘] 카카오 코딩 테스트 #1 | 코딩 테스트 문제, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment