문제링크: https://www.acmicpc.net/problem/10451
10451번: 순열 사이클
문제 1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러 가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 \(\begin{pmatrix} 1 & 2 &3&4&5&6&7&8 \\ 3& 2&7&8&1&4&5&6 \end{pmatrix}\) 와 같다. 또는, Figure 1과 같이 방향 그래프로 나타낼 수도 있다. 순열을 배열을 이용해 \(\begin{pmatrix} 1
www.acmicpc.net
문제 해결 방법은, 기본 DFS
방문 표시를 하면서 깊이 탐색하다보니, Main 문에서 실행되는 DFS 함수의 횟수는 순열의 개수와 같다.
백준 9466번 문제와 비슷하나, 9466번이 조금 더 어렵다.
10451을 풀어봣다면, 9466번을 꼭 풀어봤으면 좋겠다.
9466번 문제링크: https://www.acmicpc.net/problem/9466
9466번: 텀 프로젝트
문제 이번 가을학기에 '문제 해결' 강의를 신청한 학생들은 텀 프로젝트를 수행해야 한다. 프로젝트 팀원 수에는 제한이 없다. 심지어 모든 학생들이 동일한 팀의 팀원인 경우와 같이 한 팀만 있을 수도 있다. 프로젝트 팀을 구성하기 위해, 모든 학생들은 프로젝트를 함께하고 싶은 학생을 선택해야 한다. (단, 단 한 명만 선택할 수 있다.) 혼자 하고 싶어하는 학생은 자기 자신을 선택하는 것도 가능하다. 학생들이(s1, s2, ..., sr)이라 할 때, r=
www.acmicpc.net
#include <iostream>
#include <cstring>
using namespace std;
int T; // Test case 저장할 변수
int N; // 순열의 크기
int nArr[1001]; // 순열을 저장 할 배열
bool bVisit[1001];
void DFS(int nStart)
{
bVisit[nStart] = true;
int next = nArr[nStart];
if(!bVisit[next])
{
DFS(next);
}
}
int main(void)
{
cin >> T;
for (int i = 0; i < T; i++)
{
int nCount = 0;
cin >> N;
memset(bVisit, false, sizeof(bVisit));
for (int j = 1; j <= N; j++)
{
cin >> nArr[j];
}
for (int j = 1; j <= N; j++)
{
if (!bVisit[j])
{
DFS(j);
nCount++;
}
}
cout << nCount << endl;
}
return 0;
}
'개발 > 백준' 카테고리의 다른 글
백준 13460번: 구슬 탈출 2 (0) | 2019.10.14 |
---|---|
백준 9466번: 텀 프로젝트 (0) | 2019.09.26 |
백준 1325번: 효율적인 해킹 (0) | 2019.09.24 |
백준 1963번: 소수 경로 (0) | 2019.09.02 |
백준 1389번: 케빈 베이컨의 6단계 법칙 (0) | 2019.09.01 |