본문 바로가기

CodingTest/BOJ

[BOJ 2331] 백준 반복 수열 풀이 - C++

사용언어 :  C++

 

 

 

 

문제풀이

* 다음 값을 가진 index의 check값이 0이 아닐 때까지 while문 실행한다.

while문을 실행할 때마다 cnt를 +1하고 해당 cnt값을 check배열 해당 index에 저장.(수열에 남는 수 갯수 출력해야 함)

 

-다음 값 구하는 함수

현재 값이 0이 될 때까지 10으로 나눈 나머지 값을 다음 값에 저장-> 현재 값10으로 나누기

int next_num(int bnum) {
	int nnum = 0; //다음 값
	while (bnum != 0) { //현재 값
		nnum += pow(bnum % 10, P);
		bnum /= 10;
	}
	return nnum;
}

 

- 반복되는 수열 갯수 찾기

	int next = next_num(A); //처음 값 설정해주기
	while (check[next] == 0) { //전에 나온 적 있는 수가 나오면 while문 종료
		cnt++;
		check[next] = cnt; //저장해놓기
		next = next_num(next);
	}
	cout << check[next] - 1; //출력값

 

 

 

전체코드

#include<iostream>
using namespace std;
#include<cmath>

int check[300000];
int cnt = 1;
int A, P;

int next_num(int bnum) {
	int nnum = 0;
	while (bnum != 0) {
		nnum += pow(bnum % 10, P);
		bnum /= 10;
	}
	return nnum;
}
int main() {
	cin >> A >> P;
	check[A] ++;

	int next = next_num(A);
	while (check[next] == 0) {
		cnt++;
		check[next] = cnt;
		next = next_num(next);
	}
	cout << check[next] - 1;
}

 

 


총평

문제 자체가 복잡하진 않았는데 그 다음 값을 구하는 (나한텐 조금 복잡한) 부분에서 좀 헤맸다. 물론 다른 곳에서도 헤맸음ㅎ


문제 출처

https://www.acmicpc.net/problem/2331

 

2331번: 반복수열

첫째 줄에 반복되는 부분을 제외했을 때, 수열에 남게 되는 수들의 개수를 출력한다.

www.acmicpc.net