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
www.acmicpc.net
실버2 문제이다.
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
int N,cnt;
int map[1001][1001];
int graph[1001];
int visit[1001];
void dfs(int x){
visit[x]=1;
for(int i=1;i<=N;i++){
if(visit[i]==0 && map[x][i]==1){
dfs(i);
}
}
}
int main(){
int t;
cin>>t;
while(t--){
cnt=0;
memset(graph,0,sizeof(graph));
memset(visit,0,sizeof(visit));
memset(map,0,sizeof(map));
cin>>N;
for(int i=1;i<=N;i++){
cin>>graph[i];
}
for(int i=1;i<=N;i++){
map[i][graph[i]]=1;
}
for(int i=1;i<=N;i++){
if(visit[i]==0&&map[i][graph[i]]==1){
dfs(i);
cnt++;
}
}
cout<<cnt<<'\n';
}
}
정답 코드는 위와 같다. 문제의 예시를 입력 받는 부분에서 약간 애를 먹었다. 인덱스와 배열안의 값을 연결 한다는 생각을 해놓고도 조금 헤맸다. 결국 map[i][graph[i]] 이렇게 구성해서 i는 인덱스로, graph[i]는 그 해당하는 값으로 하고, map이라는 2차원 배열에 두 수를 연결하였다면 1을 저장, 그렇지 않다면 0으로 초기화 했다. (memset이용)
그리고, 처음에는 map을 전체를 돌면서 1 이 있다면 dfs를 돌리는 것인가 생각했었는데, 그게 아니었다.
인덱스값과 배열 안의 값이 연결되어 있기 때문에 for문을 한번만 돌려도 가능했다. 인덱스 값을 통해서 map의 두번째 인덱스 까지 쓸 수 있기 때문! (나만 이해하는 말 일듯)
암튼 한번에 맞춘 문제여서 기분이 좋았다 ^_^

'BOJ 문제풀이' 카테고리의 다른 글
#2573 빙산 (0) | 2022.04.09 |
---|---|
#14503 로봇 청소기 (0) | 2022.04.08 |
#5014 스타트링크 (0) | 2022.04.03 |
#2468 안전영역 (0) | 2022.04.03 |
#1697 숨바꼭질 (0) | 2022.04.02 |