본문 바로가기
백준

[백준 2668] 숫자고르기, c++

by 황인태(intaehwang) 2020. 7. 26.
반응형

www.acmicpc.net/problem/2668

 

2668번: 숫자고르기

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

www.acmicpc.net

취업 이후 오랜만에 ps 문제를 풀었다. 한 2달은 문제를 안풀었더니 다 까먹었다ㅠㅠ 취업준비 기간때는 그래도 골드2 이하 문제는 쉽게 풀었던거 같은데 이젠 실버2도 힘들다... 곧 자취를 하는데 다시 열심히 공부해야겠다.

본 문제는 KOI 1996 초등부 2번 문제로 cycle의 집합을 구하는 문제다. dfs를 이용하여 주어진 배열을 탐색하면서 cycle이 발생할 때 집합에 추가해야 한다. 이때 cycle의 중복이 있을 수 있으므로 중복을 제거하면 된다.

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
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
 
using namespace std;
 
bool chk[101];
int d[101];
vector<int> ans;
 
int n;
 
void cal(int start, int cur, vector<int> vis) {
  int next = d[cur];
  
  if (!chk[next]) {
    chk[next] = true;
    vis.push_back(next);
    cal(start, next, vis);
  }
  else {
    if (start == next) {
      for (int i = 0; i < vis.size(); i++) {
        ans.push_back(vis[i]);
      }
    }
  }
}
 
int main() {
  scanf("%d"&n);
  
  for (int i = 1; i <= n; i++) {
    int tmp;
    scanf("%d"&tmp);
    
    d[i] = tmp;
  }
  
  for (int i = 1; i <= n; i++) {
    memset(chk, falsesizeof(chk));
    chk[i] = true;
    vector<int> vis;
    vis.push_back(i);
    cal(i, i, vis);
  }
  
  
  
  sort(ans.begin(), ans.end());
  
  ans.erase(unique(ans.begin(), ans. end()), ans.end());
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++) {
    printf("%d\n", ans[i]);
  }
}
cs
반응형

'백준' 카테고리의 다른 글

[백준 3085] 사탕 게임, C++  (0) 2020.09.08
[백준 2309] 일곱 난쟁이, c++  (0) 2020.09.08
[백준 15685] 드래곤 커브, C++  (0) 2020.05.16
[백준 14499] 주사위 굴리기, C++  (0) 2020.05.11
[백준 3190] 뱀, C++  (0) 2020.05.11
Buy me a coffeeBuy me a coffee

댓글