seukseok의 개인 블로그

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

· boj-note

오늘은 그래프와 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문제씩 꾸준히 쌓으면, 이후 골드 구간 문제에서 구현 실수가 확실히 줄어든다.