코드트리 직접 코딩 감각 유지기 4. 북마크로 백트래킹 복습 루틴을 만들었습니다
알고리즘 공부에서 어려운 부분은 문제를 한 번 맞히는 일만이 아니었습니다. 더 중요한 지점은 다시 봐야 할 문제를 잃어버리지 않고, 며칠 뒤 같은 구조를 다시 설명할 수 있는 상태로 만드는 일이었습니다.
이전 글에서는 CodeTree 알림톡과 GitHub 잔디가 다시 접속하게 만드는 장치가 됐다고 정리했습니다. 이번에는 그 루틴을 한 단계 더 좁혀서, 북마크 기능으로 다시 풀 문제를 모아두는 방식을 확인했습니다.
오늘 복습한 문제는 강력한 폭발이었습니다. 1편에서 약점으로 남았던 백트래킹 유형으로 다시 돌아온 문제였고, 이번에는 폭탄 모양을 선택하고 상태를 복구하는 구조까지 직접 확인했습니다.
이 글은 CodeTree 직접 코딩 감각 유지기 4편입니다. 핵심은 북마크를 단순 저장 버튼으로 쓰지 않고, 나만의 오답노트와 복습 대기열로 바꾼 기록입니다.
![]()
북마크는 다시 풀 문제를 잃어버리지 않게 했습니다
문제를 풀다 보면 다시 봐야 할 문제가 생깁니다. 틀린 문제도 있고, 맞혔지만 풀이 구조가 아직 손에 붙지 않은 문제도 있습니다.
예전에는 이런 문제를 따로 메모하지 않으면 금방 흩어졌습니다. 어떤 문제에서 막혔는지, 어떤 유형을 다시 봐야 하는지 기억에 의존했습니다.
이번에는 CodeTree 북마크에서 다시 도전 문제 폴더를 만들고, 강력한 폭발을 그 안에 넣었습니다. 이 화면 하나만으로도 복습 대상이 분리됐습니다. 다음에 다시 접속했을 때 "무엇을 풀지"를 처음부터 고르지 않아도 됩니다.
| 사용한 장치 | 이번 회차에서의 역할 |
|---|---|
| 북마크 폴더 | 다시 풀 문제를 모아두는 복습 대기열입니다 |
| 문제별 저장 | 맞혔지만 다시 설명해야 하는 문제를 놓치지 않게 합니다 |
| 폴더 이름 | 다시 도전 문제처럼 목적을 직접 드러내는 이름으로 복습 기준을 만듭니다 |
3편에서 알림톡과 GitHub 잔디가 다시 접속하게 만드는 장치였다면, 이번 북마크는 접속한 뒤 무엇을 다시 볼지 정해주는 장치였습니다.
오늘 복습 대상은 강력한 폭발이었습니다
강력한 폭발은 0과 1로 구성된 격자에서 시작합니다. 1이 있는 위치마다 폭탄을 놓아야 하고, 각 위치에서는 세 가지 폭탄 모양 중 하나를 선택합니다. 목표는 초토화되는 칸의 수를 최대로 만드는 것입니다.
![]()
이 문제를 백트래킹으로 봐야 하는 이유는 선택이 여러 번 이어지기 때문입니다. 폭탄 위치가 하나라면 세 가지 중 가장 좋은 모양을 고르면 됩니다. 하지만 폭탄 위치가 여러 개라면 첫 번째 위치에서 고른 모양이 두 번째 위치의 결과와 겹칠 수 있습니다.
그래서 단순히 각 폭탄이 많이 덮는 모양만 고르면 충분하지 않습니다. 모든 폭탄 위치에 대해 세 가지 선택지를 차례로 시도하고, 한 선택을 끝낸 뒤에는 다음 선택을 위해 상태를 되돌려야 합니다.
이번 문제에서 제가 확인한 질문은 세 가지였습니다.
| 질문 | 풀이에서의 의미 |
|---|---|
| 현재 폭탄 위치는 어디인가 | 재귀의 깊이를 정합니다 |
| 세 가지 모양 중 무엇을 고를 것인가 | 현재 단계의 선택지가 됩니다 |
| 선택을 끝낸 뒤 무엇을 되돌릴 것인가 | 다음 모양을 시험하기 위한 상태 복구가 됩니다 |
이 질문이 잡히니 1편에서 막혔던 백트래킹이 조금 더 구체적인 코드 구조로 보였습니다.
풀이의 핵심은 방문 카운트와 상태 복구였습니다
처음에는 초토화된 칸을 True와 False로만 표시할 수 있다고 생각하기 쉽습니다. 하지만 이 문제에서는 여러 폭탄이 같은 칸을 덮을 수 있습니다.
겹치는 칸을 정확히 처리하려면 방문 여부만으로는 부족했습니다. 그래서 각 칸을 몇 개의 폭탄이 덮고 있는지 visited 카운트로 관리했습니다.
풀이 흐름은 다음과 같이 정리했습니다.
현재 폭탄 위치를 확인합니다
세 가지 폭탄 모양을 하나씩 선택합니다
폭탄이 덮는 칸의 방문 카운트를 올립니다
다음 폭탄 위치로 재귀 호출합니다
돌아오면 방금 올린 방문 카운트를 다시 내립니다
이 구조에서 가장 중요한 부분은 마지막 줄이었습니다. 재귀 호출이 끝난 뒤 상태를 되돌리지 않으면, 다음 폭탄 모양을 시험할 때 이전 선택의 흔적이 남습니다.
백트래킹은 정답 후보를 계속 쌓는 방식처럼 보이지만, 실제로는 선택과 복구가 한 쌍으로 움직여야 했습니다. 이번 문제에서는 그 점이 visited[nx][ny] += 1과 visited[nx][ny] -= 1로 분명히 드러났습니다.
정답 판정 이후에도 다시 설명할 수 있어야 했습니다
이번에는 맞았습니다! 판정까지 확인했습니다. 하지만 정답 판정만으로 복습이 끝났다고 보지는 않았습니다.
![]()
제출 코드에서 다시 본 핵심은 세 가지였습니다.
| 코드 요소 | 다시 확인한 의미 |
|---|---|
bombs 목록 | 1이 있는 모든 폭탄 위치를 미리 모읍니다 |
shapes 목록 | 세 가지 폭탄 모양을 상대 좌표로 표현합니다 |
visited 카운트 | 여러 폭탄이 겹치는 칸을 정확히 세기 위해 사용합니다 |
여기서 배운 점은 정답 코드의 길이가 아니라 구조였습니다. 문제를 다시 풀 때 같은 코드를 외우는 것이 목표가 아니었습니다. 다음 백트래킹 문제에서도 "무엇을 선택하고, 무엇을 기록하고, 무엇을 복구할지"를 먼저 묻는 것이 목표였습니다.
제출 과정에서 Python 들여쓰기도 다시 확인했습니다. 같은 코드라도 탭과 공백이 섞이면 실행 전에 오류가 납니다. 이 경험은 백트래킹 자체와 별개처럼 보이지만, 재귀와 중첩 반복문이 많은 문제에서는 들여쓰기 안정성도 풀이의 일부였습니다.
풀이 근거는 화면과 제출 결과로 확인했습니다
이번 글은 기억만으로 쓰지 않고, 화면과 제출 결과를 기준으로 정리했습니다. 북마크 화면은 다시 풀 문제를 모아둔 근거가 됐고, 문제 본문과 예제 화면은 풀이 조건을 확인하는 기준이 됐습니다.
정답 판정 화면은 풀이가 실제로 통과했다는 근거였습니다. 글에는 이 세 가지를 분리해서 반영했습니다.
| 확인한 근거 | 글에 반영한 내용 |
|---|---|
| 북마크 폴더 화면 | 강력한 폭발을 다시 도전할 문제로 저장했습니다 |
| 문제 본문과 폭탄 모양 화면 | 세 가지 폭탄 모양 중 하나를 고르는 문제라는 조건을 확인했습니다 |
| 예제 출력 | 예제 1과 예제 2의 출력이 각각 9와 12인지 확인했습니다 |
| 정답 판정 화면 | 제출 코드가 실제로 통과했음을 확인했습니다 |
이 구분을 둔 이유는 인증글의 신뢰도를 위해서입니다. 문제 화면, 제출 코드, 정답 판정이 함께 있어야 오늘의 복습을 근거로 남길 수 있었습니다.
다음 복습은 북마크 폴더에서 다시 시작합니다
이번 회차에서 북마크의 역할이 분명해졌습니다. 북마크는 단순히 마음에 드는 문제를 저장하는 기능이 아니라, 다시 풀 문제를 보관하는 오답노트가 될 수 있었습니다.
앞으로는 문제를 맞혔는지 여부만 보지 않겠습니다. 맞혔더라도 다음 기준에 해당하면 북마크에 넣어두려고 합니다.
| 북마크에 넣을 문제 | 이유 |
|---|---|
| 맞혔지만 풀이를 바로 설명하기 어려운 문제 | 구조가 아직 손에 붙지 않았기 때문입니다 |
| 처음에 접근 방향이 잡히지 않았던 문제 | 다음에 같은 유형을 만났을 때 시작 질문이 필요하기 때문입니다 |
| 코드 오류가 반복됐던 문제 | 알고리즘뿐 아니라 구현 습관도 같이 복습해야 하기 때문입니다 |
이번 4편은 백트래킹을 완전히 끝냈다는 기록이 아닙니다. 더 정확히는 다시 돌아올 문제를 고르고, 그 문제를 풀어본 뒤, 풀이 구조를 설명 가능한 형태로 남긴 기록입니다.
다음에는 북마크 폴더에 쌓인 문제를 기준으로 다시 풀겠습니다. 문제를 맞히는 순간보다, 다시 풀 수 있게 정리하는 순간을 더 중요하게 보겠습니다.
CodeTree 바로가기 https://www.codetree.ai/ko
해시태그 #코드트리 #코딩테스트 #코테공부 #오답노트 #공부습관 #북마크 #백트래킹
이어 읽기
시리즈는 순서대로, 편집 추천은 맥락대로, 비슷한 주제는 태그 기준으로 정리합니다.
시리즈 전체
코드트리 직접 코딩 감각 유지기4/4편- 1.코드트리 직접 코딩 감각 유지기 1. 갭체크로 백트래킹 약점을 확인했습니다
- 2.코드트리 직접 코딩 감각 유지기 2. 백트래킹 전에 파이썬 기초를 다시 확인했습니다
- 3.코드트리 직접 코딩 감각 유지기 3. 알림톡과 GitHub 잔디로 루틴을 유지했습니다
- 4.코드트리 직접 코딩 감각 유지기 4. 북마크로 백트래킹 복습 루틴을 만들었습니다
비슷한 주제의 글
태그가 겹치는 글입니다. 시리즈와 편집 추천에 이미 나온 글은 제외합니다.
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로 바뀌는 과정을 설명합니다.