SW
[백준 2331] 반복수열 본문
0. 제목
- 백준 2331 반복수열
- BOJ 2331 반복수열
- C++ 2331 반복수열
1. 문제
https://www.acmicpc.net/problem/2331
2. 풀이
- DFS를 사용하였다.
- visited는 방문횟수를 저장하는 배열이다.
- 인덱스의 최댓값은 300000을 넘지 못하므로 visited[300001] 으로 크기를 설정하였다.
- dfs함수를 구현할 때 방문할때마다 visited[x]의 값을 1씩 증가시켜주었다.
- 그리고 if(visited[x]==3) retun; 에서 3일때 return 해야 하는 이유는 문제에서 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 구하라고 하였기 때문이다.
- 만약 2에서 return을 해버리면 반복되는 수들까지 개수에 포함이 된다. 그래서 3일때 return 을 하도록 하고 count 값을 구할 때 단 한번만 방문했던 원소들 즉, visited[x] 의 값이 1인 원소들만 세도록 한다.
- 한번만 방문했던 원소들의 개수를 센 것이 정답이다.
- DFS방식을 사용하지 않는다면 vector를 사용해서 vector의 size를 계산하고 어떤 인덱스의 값과 그 전 값들을 비교하여 전에 있었던 값이 또 나오면 그 인덱스 값을 return 해주는 방식으로도 풀 수 있다.
3. 코드
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
|
#include <iostream>
#include <cmath>
using namespace std;
void dfs(int x);
int visited[300001] = {0};
int A, P;
int main(int argc, const char * argv[]) {
int count = 0;
cin >> A >> P;
dfs(A);
for(int i = 0; i < 300001; i++){
if(visited[i] == 1)
count++;
}
cout << count << '\n';
return 0;
}
void dfs(int x){
visited[x]++;
if(visited[x] == 3)
return;
int sum = 0;
while(x){
sum += (int)pow((x % 10), P);
x /= 10;
}
dfs(sum);
}
|
'대학교 > Algorithm' 카테고리의 다른 글
[백준 10610] 30 (0) | 2020.02.08 |
---|---|
[백준 2875] 대회 or 인턴 (0) | 2020.02.07 |
[백준 11047] 동전 0 (0) | 2020.02.05 |
[백준 10451] 순열 사이클 (0) | 2020.02.02 |
[백준 1912] 연속합 (0) | 2020.02.01 |
Comments