seukseok의 개인 블로그

BOJ 풀이 노트: 연결 요소 탐색과 1,2,3 더하기 DP 점검

· tech

BOJ 11724와 9095를 대상으로, 연결 요소 카운팅 BFS와 기초 점화식 DP를 구현 실수 포인트 중심으로 정리한 풀이 노트.

오늘은 그래프와 DP 기본기를 같이 점검하는 조합으로 2문제를 풀었다.

11724는 “방문 처리 누락 없이 컴포넌트 수 세기”가 핵심이고, 9095는 “작은 점화식을 정확히 세우고 재사용하기”가 핵심이다. 둘 다 난도 대비 자주 쓰이는 기본 패턴이라 꾸준히 반복할 가치가 있다.

1) BOJ 11724 - 연결 요소의 개수

문제 핵심 요약

무방향 그래프에서 서로 도달 가능한 정점 묶음(연결 요소)이 몇 개인지 구하는 문제다.

접근 아이디어(왜 이 방법인지)

정점 1부터 N까지 순회하면서, 아직 방문하지 않은 정점을 시작점으로 BFS를 한 번 돌리면 그 BFS가 정확히 연결 요소 하나를 덮는다.

즉, “미방문 정점을 하나 잡아 탐색 시작”할 때마다 연결 요소 카운트를 1 증가시키면 된다. DFS로 풀어도 동일하지만, 이번 풀이에서는 큐 기반 BFS로 구현했다.

시간/공간 복잡도

실수하기 쉬운 포인트

C++ 코드 설명(핵심 라인)

for (int start = 1; start <= N; ++start) {
    if (visited[start]) continue;
    components++;
    ...
}

미방문 정점을 만날 때마다 새 BFS를 시작하고, 그 시점에 연결 요소 수를 증가시킨다.

for (int nxt : graph[cur]) {
    if (visited[nxt]) continue;
    visited[nxt] = true;
    q.push(nxt);
}

인접 정점을 큐에 넣기 전에 바로 방문 체크를 해 중복 삽입을 막는다.

다른 풀이 가능성


2) BOJ 9095 - 1, 2, 3 더하기

문제 핵심 요약

정수 n을 1, 2, 3의 합으로 나타내는 방법의 수를 구한다. 순서가 다르면 다른 경우로 센다.

접근 아이디어(왜 이 방법인지)

마지막에 더한 수를 기준으로 보면 점화식이 바로 나온다.

그래서 dp[n] = dp[n-1] + dp[n-2] + dp[n-3] 가 된다. 문제 입력 범위가 작아서(최대 10) 미리 dp[10]까지 채워 두고 각 테스트케이스를 즉시 출력하면 된다.

시간/공간 복잡도

실수하기 쉬운 포인트

C++ 코드 설명(핵심 라인)

dp[1] = 1;
dp[2] = 2;
dp[3] = 4;

점화식 전개를 위한 필수 초기값이다.

for (int i = 4; i <= 10; ++i) {
    dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}

작은 값부터 차례대로 채우는 전형적인 bottom-up DP다.

다른 풀이 가능성


오늘 정리 포인트는 간단하다.

기본기 문제라도 매일 2문제씩 꾸준히 쌓으면, 이후 골드 구간 문제에서 구현 실수가 확실히 줄어든다.