본문 바로가기

Algorithm Problems/수학

[백준/C++] 5692번: 팩토리얼 진법

문제

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


문제 요약

팩토리얼 진법 숫자가 주어졌을 때, 10진수로 변환하여 출력한다.

 

ex) 719 = 7 × 3! + 1 × 2! + 9 × 1! = 53


코드

#include <iostream>

using namespace std;

int main() {
	// 시간 단축 코드
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	while (true) {
		int num;
		cin >> num;

		// 반복문 종료 조건
		if (num == 0) {
			break;
		}
		
		// 초기 변수 설정
		int res = 0;
		int mul = 1;
		int cnt = 1;

		// 각 자릿수에 대한 팩토리얼 값 계산
		while (num != 0) {
			res += (num % 10) * mul;
			num /= 10;
			cnt++;
			mul *= cnt;
		}

		cout << res << "\n";
	}
}

코드 설명

1. 무한 반복문 내에서 팩토리얼 진법 숫자 num을 입력 받는다.

+ 입력 받은 수가 0이라면, 반복을 종료한다.

 

2. 변수를 초기 설정한다.

- res: 팩토리얼 진법 숫자를 10진수로 변환한 결과

- mul: 각 자릿수마다 곱해줄 숫자

- cnt: mul을 계산하기 위해 몇 번째 자릿수인지 체크하는 숫자

 

3. num이 0이 될 때까지 10으로 나누면서 1의 자릿수부터 팩토리얼 값을 계산하면서 res를 구한다.

+ %와 / 연산자를 이용한다.

 

4. res를 출력한다.


고찰

조금 당황했지만, 진수 계산 과정을 차근차근 생각해보면서 구현하면 어렵지 않다.

 

C++ 기준 입출력 시간 단축 코드를 넣어주어야 시간초과가 발생하지 않는다.