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

 

이번에 볼 문제는 백준 11558번 문제인 The Game of Death이다.
문제는 아래 링크를 확인하자.

www.acmicpc.net/problem/11558

 

11558번: The Game of Death

첫 줄에는 테스트 케이스의 숫자 T가 주어지며, 이어서 T번에 걸쳐 테스트 케이스들이 주어진다. 매 테스트 케이스의 첫 줄에는 플레이어의 숫자 N(1 ≤ N ≤ 10,000)이 주어진다. 이어서 N줄에 걸쳐

www.acmicpc.net

각 테스트케이스에 해당되는 문제를 간단히 요약하면 다음과 같다.

 

1) 1부터 N까지의 정수 번호가 붙은 N개의 노드가 있다. 각 노드에는 그 노드를 출발점으로 하는 directed edge가 정확히 하나씩 존재한다. (이 edge는 loop일 수도 있다.)

2) 1번 노드에서 N번 노드까지 가는 최단경로의 길이를 출력한다. 그러한 경로가 없다면 0을 출력한다.

 

각 노드를 방문할 때마다 다음으로 방문할 수 있는 노드는 오직 하나뿐이므로, 이 문제에서는 그래프를 배열로 구현할 수 있다. visited 배열을 만들어 N을 먼저 방문하면 경로의 길이를, 방문했던 점으로 되돌아오는 경우가 저 발생한다면 0을 리턴한다.

 

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

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

int G[10001];
int visited[10001];

bool chk = 1;
int cnt = 0;

void dfs(int current, int N) {
	if (current == N) return;
	int next = G[current];
	if (visited[next]) chk = 0;
	else {
		cnt++;
		visited[next] = 1;
		dfs(next, N);
	}
}

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

	int T; cin >> T;
	while (T--) {
		chk = 1;
		cnt = 0;
		memset(visited, 0, sizeof(visited));

		int N; cin >> N;
		for (int i = 1; i <= N; i++) {
			cin>>G[i];
		}
		
		dfs(1, N);

		if (chk) cout << cnt << '\n';
		else cout << 0 << '\n';
	}
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 11560 // C++] 다항식 게임  (0) 2021.05.10
[BOJ 11559 // C++] Puyo Puyo  (0) 2021.05.09
[BOJ 11557 // C++] Yangjojang of The Year  (0) 2021.05.07
[BOJ 1275 // C++] 커피숍2  (0) 2021.05.06
[BOJ 21237 // C++] Clockwise Fence  (0) 2021.05.05

+ Recent posts