알고리즘/백준

[백준 2668] 숫자고르기 C++

겜도리도리 2021. 9. 28. 23:57
반응형

문제

백준 2668 숫자고르기 C++

 

2668번: 숫자고르기

세로 두 줄, 가로로 N개의 칸으로 이루어진 표가 있다. 첫째 줄의 각 칸에는 정수 1, 2, …, N이 차례대로 들어 있고 둘째 줄의 각 칸에는 1이상 N이하인 정수가 들어 있다. 첫째 줄에서 숫자를 적절

www.acmicpc.net

풀이

각각의 정점에서 dfs를 실행하면서, 다른 루프와 겹치는지 검사합니다.

겹치지 않았다면 cnt를 늘려주고 check 표시를 합니다.

이후 check된 노드들을 표시합니다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
 
int graph[101];
bool visited[101];
bool check[101];
vector<int> v;
int cnt;
int maxcnt;
 
void dfs(int start, int node) {
    visited[node] = true;
    int next = graph[node];
    cnt++;
    v.push_back(node);
    // 시작 지점으로 돌아오면 중복 검사
    if (next == start) {
        bool overlap = false;
        // 중복 검사
        for (int i = 0; i < v.size(); i++) {
            if (check[v[i]] == true) {
                overlap = true;
                break;
            }
        }
        // 다른 부분과 중복되지 않으면 check 해주기
        if (!overlap) {
            for (int i = 0; i < v.size(); i++) {
                check[v[i]] = true;
            }
            maxcnt += cnt;
        }
    }
    // 다른 방문한 노드로 가는 경우에는 return
    else if (visited[next])
        return;
    // 방문하지 않았으면 dfs 재귀 호출
    else {
        dfs(start, next);
    }
}
int main() {
    // 입력
    int N;
    cin >> N;
    for (int i = 1; i <= N; i++) {
        cin >> graph[i];
    }
    // dfs
    for (int i = 1; i <= N; i++) {
        cnt = 0;
        memset(visited, 0sizeof(visited));
        v.clear();
        dfs(i, i);
    }
    cout << maxcnt << '\n';
    // check 된 것들 출력
    for (int i = 1; i <= N; i++) {
        if (check[i])
            cout << i << '\n';
    }
    return 0;
}
cs
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 6593] 상범 빌딩 C++  (0) 2021.10.01
[백준 17471] 게리맨더링 C++  (0) 2021.09.29
[백준 9084] 동전 (C++)  (0) 2021.09.27
[백준 2981] 검문 C++  (0) 2021.09.26
[백준 14226] 이모티콘 C++  (0) 2021.09.26