코드트리 후기: 코딩테스트 준비를 갭체크로 시작했다
코딩테스트 공부를 다시 잡으려고 하면 항상 같은 고민에서 시작한다.
문제를 많이 풀어야 한다는 건 안다. 그런데 지금 당장 어떤 문제를 풀어야 하는지는 잘 모른다. 쉬운 문제부터 다시 풀자니 너무 돌아가는 것 같고, 어려운 문제부터 풀자니 어디서 막히는지 모른 채로 시간을 쓰게 된다.
그래서 이번에는 문제를 먼저 고르기 전에 코드트리의 갭체크를 먼저 봤다. 목표는 점수를 확인하는 것이 아니라, 지금 내 코딩테스트 준비에서 어디가 흔들리는지 확인하는 것이었다.
결과는 생각보다 명확했다.
조건문은 해결했다. 시뮬레이션 I도 한 번의 시도로 풀었고, 완전탐색 III도 한 번에 해결했다. 반면 Backtracking 문제는 두 개 모두 건너뛴 문제로 남았다. 갭체크 핵심 요약도 Backtracking을 부족한 지식으로 표시했다.
이 결과를 보고 처음 든 생각은 "아직 기초가 부족하구나"였다. 그런데 조금 더 보면 단순히 기초 전체가 무너진 것은 아니었다. 조건을 읽고 분기하는 문제, 상태를 계산하는 시뮬레이션 문제, 완전탐색 문제는 어느 정도 손이 움직였다. 문제는 가능한 선택을 깊이 들어가며 탐색하고, 다시 이전 상태로 돌아와 다른 선택을 시도하는 구조였다.
내가 건너뛴 것은 어려운 문제가 아니라 구조였다
이번 갭체크에서 눈에 남은 건 3번과 5번이었다.
둘 다 Backtracking 문제였고, 시도 횟수는 0회였다. 소요 시간도 각각 14초, 4초로 기록됐다. 오래 고민하다가 틀린 것이 아니라, 문제를 보고 바로 손을 대지 못한 쪽에 가까웠다.
이 차이가 중요했다.
틀린 문제는 어느 정도 풀이 방향이 있었는데 구현에서 실패했을 수 있다. 하지만 건너뛴 문제는 시작 구조 자체가 잡히지 않았다는 뜻이다. 백트래킹에서 필요한 것은 문법 하나가 아니다.
현재 단계에서 무엇을 고를 것인가
고른 값을 어디에 저장할 것인가
언제 하나의 경우가 완성되는가
조건에 맞지 않을 때 어디서 멈출 것인가
재귀 호출이 끝난 뒤 어떤 상태를 되돌릴 것인가
이 질문들이 잡혀야 코드가 나온다. 나는 이 흐름을 머리로는 알고 있다고 생각했지만, 실제 문제 앞에서는 바로 꺼내 쓰지 못했다.
조건문과 시뮬레이션은 통과했지만, 그다음이 문제였다
갭체크 결과를 보면 모든 부분이 나쁘지는 않았다.
1번 조건문 문제는 2분 42초에 한 번의 시도로 해결했다. 2번 시뮬레이션 I 문제도 5분 25초에 한 번의 시도로 훌륭하게 해결한 문제로 기록됐다. 4번 완전탐색 III도 5분 3초에 한 번에 해결했다.
이 결과는 나름 반가웠다. 입력을 읽고, 조건을 나누고, 문제에서 요구하는 상태를 계산하는 기본 감각은 아직 남아 있었다. 특히 시뮬레이션 문제는 조건을 차분히 코드로 옮기는 연습이 중요한데, 적어도 그 단계에서는 크게 무너지지 않았다.
하지만 백트래킹으로 넘어가면 이야기가 달라졌다.
완전탐색은 가능한 경우를 확인한다는 점에서 백트래킹과 이어져 있다. 그런데 백트래킹은 단순히 반복문을 많이 쓰는 문제가 아니다. 한 번 선택하고, 다음 단계로 들어가고, 조건을 확인하고, 다시 돌아오는 흐름을 직접 설계해야 한다.
내가 막힌 지점도 여기였다.
반복문으로 가능한 경우를 나열하는 문제는 어떻게든 시작할 수 있다. 하지만 재귀 함수가 "현재 몇 번째 선택을 처리하는지", 선택한 값이 어디에 쌓이는지, 호출이 끝난 뒤 무엇을 복구해야 하는지 정해야 하는 순간 손이 멈췄다.
갭체크가 좋았던 점은 다음 공부가 바로 보였다는 것이다
기존에 코딩테스트 공부를 할 때는 대체로 문제를 먼저 풀었다. 막히면 해설을 보고, 비슷한 문제를 하나 더 풀었다. 이 방식도 필요하지만, 오래 하다 보면 내가 어떤 개념에서 흔들리는지 흐려진다.
코드트리 갭체크는 그 지점을 꽤 직접적으로 보여줬다.
이번 결과에서 내가 가져갈 결론은 단순하다.
조건문과 시뮬레이션은 유지한다.
완전탐색은 풀이 속도를 더 안정화한다.
백트래킹은 가장 기초 문제부터 다시 잡는다.
특히 백트래킹은 바로 어려운 문제로 들어가면 안 되겠다는 생각이 들었다. 먼저 N개 중 M개 고르기, 중복 없이 순열 만들기, K개 중 하나를 N번 선택하기 같은 기본 구조부터 반복해야 한다. 문제 이름은 달라도 재귀 함수의 뼈대는 비슷하다.
중요한 것은 정답 코드를 외우는 것이 아니다. 다음 틀을 내 손으로 설명할 수 있어야 한다.
choose(depth)
depth가 끝까지 갔는지 확인한다
가능한 선택지를 순회한다
현재 선택을 기록한다
다음 depth로 들어간다
돌아오면 선택을 복구한다
이 흐름이 자연스러워져야 DFS, BFS, DP 같은 다음 주제로 넘어갈 때도 덜 흔들릴 것 같다.
문제 은행보다 약점에 맞는 경로가 필요했다
참고한 코드트리 후기들에서 공통적으로 나온 말이 있었다. 코드트리는 단순히 문제만 모아둔 곳이라기보다, 개념에서 기본 문제, 연습 문제, 테스트 문제로 이어지는 흐름이 있다는 점이었다.
이번에 갭체크를 보고 나니 그 장점이 더 분명하게 느껴졌다.
문제를 많이 풀 수 있는 사이트는 이미 많다. 하지만 내 약점을 모르는 상태에서는 어떤 문제를 골라야 할지부터 고민이 된다. 반면 갭체크를 먼저 보면 적어도 지금은 "백트래킹을 피하지 말고 기초부터 다시 보자"는 방향이 생긴다.
내게는 이 방향성이 가장 큰 수확이었다.
문제를 더 많이 푸는 것보다 먼저 필요한 것은 내가 어디서 멈추는지 인정하는 일이었다. 이번 결과에서 나는 백트래킹 문제를 틀린 것이 아니라 아예 시작하지 못했다. 그래서 다음 학습 목표도 분명해졌다.
다음에는 백트래킹 기본 구조부터 다시 잡는다
이번 회차의 목표는 많은 문제를 푸는 것이 아니다.
먼저 백트래킹의 기본 구조를 다시 손에 붙이는 것이다. 문제를 읽고 바로 코드를 치기 전에, 선택 단계와 종료 조건, 상태 복구 위치를 먼저 적어볼 생각이다. 그리고 풀이를 맞힌 뒤에도 그냥 넘어가지 않고 "이 재귀 함수는 정확히 무엇을 의미하는가"를 한 줄로 설명해보려고 한다.
코딩테스트 준비에서 불안한 부분은 대체로 막연하다. 그런데 막연함을 그대로 두면 계속 피하게 된다. 이번 코드트리 갭체크는 그 막연함을 Backtracking이라는 구체적인 이름으로 바꿔줬다.
그래서 이번 후기는 좋은 결과를 받았다는 이야기가 아니다. 오히려 피하고 있던 부분이 드러났다는 기록에 가깝다.
다음에는 백트래킹 기본 문제를 풀고, 이번에는 건너뛴 문제를 다시 시도해보는 쪽으로 이어가려고 한다.
코드트리 바로가기: https://www.codetree.ai/ko
해시태그: #코드트리 #코딩테스트 #갭체크 #후기 #백트래킹 #알고리즘공부
이어 읽기
시리즈는 순서대로, 편집 추천은 맥락대로, 비슷한 주제는 태그 기준으로 정리합니다.
함께 읽으면 좋은 글
편집 추천비슷한 주제의 글
태그가 겹치는 글입니다. 시리즈와 편집 추천에 이미 나온 글은 제외합니다.
LLM 공부 01 | LLM은 검색기가 아니라 다음 토큰 생성기다
LLM을 내부 검색기로 오해하지 않도록, 문장이 token으로 바뀌고 embedding, Transformer block, LM head, prefill/decode, KV cache를 거쳐 다음 token이 생성되는 흐름을 입문자 관점에서 정리한다.
LLM 공부 02 | 토큰이 비용을 만든다
Tokenizer가 문장을 token ID로 바꾸고 embedding table과 LM head가 vocabulary와 연결되는 구조를 설명하며, vocabulary 변화가 sequence length, KV cache, 사용자 토큰 비용 체감으로 이어지는 이유를 정리한다.
LLM 공부 03 | Transformer 안에서 문맥이 섞이는 방식
Embedding된 token 벡터가 Transformer block stack을 통과하며 self-attention, Q/K/V, causal mask, MLP/FFN, residual stream을 거쳐 다음 token 예측에 필요한 hidden state로 바뀌는 과정을 설명한다.