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
'Computer Science > Algorithm Problem' 카테고리의 다른 글
백준] 1049 - 기타줄 (0) | 2019.02.03 |
---|---|
백준] 9020 - 골드바흐의 추측(ACM-ICPC Regionals) (0) | 2019.02.03 |
백준] 2942 - 퍼거슨과 사과(COCI 2008/2009) (0) | 2019.01.27 |
백준] 2456 - 나는 학급회장이다(한국정보올림피아드:KOI 2011 지역본선) (0) | 2019.01.23 |
백준] 10984 - 내 학점을 구해줘(2015 KAIST 5th ACM-ICPC Mock) (0) | 2019.01.22 |