https://www.acmicpc.net/problem/4370
4370번: 곱셈 게임
각 테스트 케이스에 대해서, 백준이가 이길 때는 "Baekjoon wins."를, 동혁이가 이길 때는 "Donghyuk wins."를 출력한다.
www.acmicpc.net
백준과 동혁이 항상 최적의 플레이를 하므로, 둘이 사용하는 수는 항상 2와 9뿐이다. 또 여기서 최적의 플레이란, 이기는 사람은 항상 수를 크게 만들고 지는 사람은 항상 수를 최소로 만드는 것이므로, 백준과 동혁이 한 턴씩 번갈아 p에 수를 곱했을 때 나오는 수는 p * 18이고 시작하는 수는 반드시 1이므로 백준과 동혁이 k번씩 수를 곱했다면 나오는 수는 18 ^ k이다.
주어진 수 n이 백준이 이기는 경우라고 가정하면 백준은 반드시 9를 곱할 것이므로 n은 18 ^ k 초과 9 * 18 ^ k 이하이고, n이 동혁이 이기는 경우라고 가정하면 백준은 반드시 2를, 동혁은 9를 곱할 것이므로 n은 9 * 18 ^ k 초과 18 ^ (k + 1) 이하일 것이다. 따라서 설명한 과정대로 p를 곱해나가면 p가 n보다 크거나 같아지는 순간 답을 알아낼 수 있다.
#include <cstdio>
int main() {
// 동혁이 이긴다면 true, 백준이 이긴다면 false
bool i;
// n: 곱셈으로 만들 수, p: 최적의 플레이로 계산한 수
unsigned int n, p, mul[2] = { 9, 2 };
// n을 입력받은 뒤 숫자가 입력됐다면 1부터
while ((p = scanf("%d", &n)) != EOF) {
// k에 9와 2를 번갈아서 곱하면서 마지막으로 곱한 수가 9인지 2인지를 i에 저장
for (i = false; (p *= mul[i]) < n; i = !i);
// 마지막으로 곱한 수가 9라면 백준이, 2라면 동혁이 이긴다
printf("%s wins.\n", i ? "Donghyuk" : "Baekjoon");
}
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
백준 12738번: 가장 긴 증가하는 부분 수열 3 (0) | 2022.01.22 |
---|---|
백준 17218번: 비밀번호 만들기 (0) | 2022.01.22 |
백준 16456번: 하와와 대학생쨩 하와이로 가는 거시와요~ (0) | 2022.01.21 |
백준 18430번: 무기 공학 (0) | 2022.01.20 |
백준 15973번: 두 박스 (0) | 2022.01.20 |