Computer Science/Algorithm Problem

백준] 5692 - 팩토리얼 진법(ACM-ICPC Regionals)

TwinParadox 2019. 1. 27. 12:42
728x90

시간 제한 : 1초

메모리 제한 : 128MB




입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 최대 5자리인 팩토리얼 진법 숫자가 주어진다. 입력의 마지막 줄에는 0이 하나 주어진다.




출력

각 테스트 케이스에 대해서, 입력으로 주어진 팩토리얼 진법 숫자를 10진법으로 읽은 값을 출력한다.




소스코드

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	int arr[6] = { 0, 1, 2, 6, 24, 120 };
	while (1)
	{
		string s;
		int len, sum = 0;
		cin >> s;
		if (s == "0")
			break;

		len = s.length();
		for (int i = 0; i < len; i++)
			sum += arr[len - i] * (s[i] - '0');

		cout << sum << '\n';
	}
}




Tip

팩토리얼에 대한 이해와 문자열을 이용하는 방법을 사용하면 쉽게 풀리는 것 같지만 시간 초과의 늪에 빠지는 경우가 있다. 일단 두 가지 개선 방법을 찾아야 한다.


1. 진법 계산을 할 때마다 팩토리얼 계산을 하지 않아야 한다.

2. 입출력 속도


1번의 문제는 로직 자체의 문제기 때문에 납득할 수 있지만, 2번의 문제는 개인적으로 매우 싫어하는 문제다.

C++을 사용하는 유저 기준으로는 endl을 '\n'으로, 입출력의 std::ios::sync_with_stdio(false)와 cin.tie(0)를 사용해야 한다.

728x90
728x90