※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 27915번 문제인 금광이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/27915 

 

27915번: 금광

최근 설곽국에 금광이 발견되었습니다. 금광에는 총 $N$개의 방이 있으며, 1번부터 $N$번까지의 번호가 붙어 있습니다. $1$번 방은 입구와 연결되어 있고, 나머지 모든 방은 부모 방을 정확히 하나

www.acmicpc.net

주어진 조건에 따라 문제에서 주어지는 금광은 1번 방을 루트로 하는 트리구조로 모델링할 수 있음을 알 수 있다.

 

모든 방은 1번 방으로부터 거리가 홀수인 방(O)과 짝수인 방(E) 둘로 구분할 수 있다. 이 때, 어떤 회사도 O에 해당하는 방을 둘 이상 채굴하거나 E에 해당하는 방을 둘 이상 채굴하는 것은 불가능함을 관찰하자. 또한, O에 해당하는 방 하나와 E에 해당하는 방을 골랐을 때 이 두 방 사이의 거리는 항상 홀수가 됨 또한 관찰하자.

 

위의 관찰을 이용하면 O에 해당하는 방의 개수와 E에 해당하는 방의 개수 중 더 큰 값이 문제의 답이 됨을 알 수 있다. 그래프 탐색 알고리즘등을 이용해 거리가 홀수인 방 및 짝수인 방의 개수를 구하고 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
using namespace std;

int N;
vector<int> G[100001];
int cnt;

void dfs(int cur, int p) {
	if (p) cnt++;
	p ^= 1;
	for (auto& nxt : G[cur]) dfs(nxt, p);
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int n = 2; n <= N; n++) {
		int x; cin >> x;
		G[x].emplace_back(n);
	}

	dfs(1, 0);

	cout << max(cnt, N - cnt);
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 12931 // C++] 두 배 더하기  (1) 2023.10.23
[BOJ 1484 // C++] 다이어트  (1) 2023.10.22
[BOJ 27914 // C++] 인터뷰  (0) 2023.10.20
[BOJ 14171 // C++] Cities and States  (0) 2023.10.19
[BOJ 14170 // C++] Counting Haybales  (0) 2023.10.18

+ Recent posts