반응형
문제
https://www.acmicpc.net/problem/2331
2331번: 반복수열
첫째 줄에 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 출력한다.
www.acmicpc.net
풀이
수열 D의 숫자들이 반복되는 시작점을 N 이라고 했을 때 반복되는 부분을 제외한 나머지 부분의 개수는 N - 1 개가 된다. 그리고 숫자의 반복이 어디서부터 시작되는지 쉽게 알 수 있도록 그래프를 이용해 수열의 수들을 방문한 점과 방문하지 않은 점으로 구분한다. 결국 그래프에서 사이클을 제외한 길이를 구하는 문제가 된다.
1. A에 해당하는 노드를 방문한다. 방문 순서를 증가한다.
2. A = next(A)를 방문하지 않았다면 방문한다. 방문 순서를 증가한다.
3. 2를 만족한다면 계속 반복한다.
4. 3이 끝났을때 A의 방문 순서 부터 사이클이 형성된다.
코드
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
|
#include <iostream>
#include <cmath>
using namespace std;
int P;
int A;
pair<int, bool> visit[236197];
int len = 1;
int nextPos(int idx)
{
int next = 0;
while (idx)
{
next += pow(idx % 10, P);
idx /= 10;
}
return next;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
cin >> A >> P;
visit[A] = make_pair(len, true);
A = nextPos(A);
while (!visit[A].second)
{
len++;
visit[A] = make_pair(len, true);
A = nextPos(A);
}
cout << visit[A].first - 1;
return 0;
}
|
cs |
반응형
'BOJ' 카테고리의 다른 글
백준 1912 - 연속합 (0) | 2019.08.06 |
---|---|
백준 11054 - 가장 긴 바이토닉 부분 수열 (0) | 2019.07.26 |
백준 2609 - 최대공약수와 최소공배수 (0) | 2019.07.17 |
백준 11399 - ATM (0) | 2019.07.16 |
백준 11055 - 가장 큰 증가 부분 수열 (0) | 2019.07.16 |