BOJ 풀이 노트: DP와 BFS 기본기 점검
· tech
BOJ 1463, 2667을 통해 1차원 DP 최소 연산 문제와 격자 연결요소 탐색 기본기를 점검한 기록.
오늘은 DP 1문제 + 그래프 탐색 1문제로 루틴을 진행했다.
- BOJ 1463 - 1로 만들기
- BOJ 2667 - 단지번호붙이기
둘 다 자주 재등장하는 유형이라, 템플릿처럼 재사용 가능한 포인트 중심으로 정리한다.
1) BOJ 1463 - 1로 만들기
문제 핵심 요약
정수 N을 1로 만드는 최소 연산 횟수를 구하는 문제다.
가능한 연산은 다음 세 가지다.
N이 3으로 나누어떨어지면 3으로 나누기N이 2로 나누어떨어지면 2로 나누기- 1 빼기
핵심은 매 단계에서 선택지가 여러 개라서, 당장 좋아 보이는 선택만으로는 최적해를 보장하기 어렵다는 점이다.
접근 아이디어(왜 이 방법인지)
이 문제는 최소 횟수를 묻고, i의 답이 i-1, i/2, i/3의 답과 직접 연결되므로 1차원 DP가 가장 자연스럽다.
정의:
dp[i] = i를 1로 만드는 최소 연산 횟수
점화:
- 기본적으로
dp[i] = dp[i-1] + 1 i % 2 == 0이면dp[i] = min(dp[i], dp[i/2] + 1)i % 3 == 0이면dp[i] = min(dp[i], dp[i/3] + 1)
작은 수부터 채우면 큰 수의 최적해를 안정적으로 만들 수 있다.
시간/공간 복잡도
- 시간:
O(N) - 공간:
O(N)
실수하기 쉬운 포인트
dp[i-1] + 1초기화를 안 하면 나눗셈 케이스만 비교하게 되어 누락이 생긴다.i=1시작값(dp[1]=0)을 흐리게 두면 전체가 꼬인다.- 조건 분기를
if-else if로 써서 2와 3 모두로 나누어지는 수(예: 6) 비교를 놓치는 실수가 잦다.
C++ 코드 설명(핵심 라인)
dp[i] = dp[i - 1] + 1;
if (i % 2 == 0) dp[i] = min(dp[i], dp[i / 2] + 1);
if (i % 3 == 0) dp[i] = min(dp[i], dp[i / 3] + 1);
한 줄씩 후보를 좁혀가며 최소 연산을 보장하는 핵심 로직이다.
다른 풀이 가능성
BFS로 상태 그래프를 만들어도 최소 횟수를 구할 수 있다. 다만 이 문제는 상태 전이가 단순하고 범위가 연속적이라 DP가 구현량/가독성 측면에서 더 유리하다.
2) BOJ 2667 - 단지번호붙이기
문제 핵심 요약
N x N 지도에서 집(1)이 상하좌우로 연결된 묶음을 단지로 보고,
- 단지 수
- 각 단지 내 집 수(오름차순) 를 출력하는 문제다.
즉, 격자 그래프의 연결요소 개수와 각 컴포넌트 크기를 구하는 전형 문제다.
접근 아이디어(왜 이 방법인지)
무가중치 격자에서 연결요소를 세는 문제이므로 BFS/DFS 둘 다 정석이다. 이번 풀이에서는 BFS를 사용했다.
절차:
- 격자를 순회하다가 방문하지 않은
1을 만나면 BFS 시작 - BFS가 확장한 칸 수를 해당 단지 크기로 기록
- 모든 단지 크기 수집 후 정렬
방문 처리는 별도 배열 대신 원본 격자에서 1 -> 0으로 바꿔 메모리를 줄였다.
시간/공간 복잡도
- 시간:
O(N^2)(각 칸을 최대 1번 방문) - 공간:
O(N^2)(최악의 경우 큐)
실수하기 쉬운 포인트
- 대각선까지 연결로 처리하면 오답이다(상하좌우만 허용).
- 방문 처리를 큐에 넣을 때가 아니라 뺄 때 하면 중복 삽입이 늘어난다.
- 단지 크기 정렬을 누락하면 출력 형식이 맞지 않는다.
C++ 코드 설명(핵심 라인)
if (board[nx][ny] != '1') continue;
board[nx][ny] = '0';
q.push({nx, ny});
++cnt;
유효한 집 칸만 확장하고 즉시 방문 마킹해서 중복 방문을 막는다.
sort(sizes.begin(), sizes.end());
문제 요구사항(오름차순 출력)을 맞추는 마지막 단계다.
다른 풀이 가능성
재귀 DFS도 가능하다. 다만 입력 크기에 따라 재귀 깊이 이슈를 피하고 싶다면 큐 기반 BFS가 안전하다.
오늘 정리 포인트:
- 1463은 “기본 후보(i-1) + 나눗셈 후보 비교” 패턴만 안정적으로 기억하면 된다.
- 2667은 “연결요소 탐색 + 크기 누적 + 정렬” 3단계로 고정하면 실수가 크게 줄어든다.