Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
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
Archives
Today
Total
관리 메뉴

차근차근

[백준 2331] 반복수열 본문

대학교/Algorithm

[백준 2331] 반복수열

SWKo 2020. 2. 7. 01:54

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