이 문제에서는 세 개의 정수 A, B, T가 주어지며, 두 개의 정수를 활용하는 짝수-홀수 턴 게임을 진행하는 프로그램을 작성하는 것이 목표입니다.
입력 값의 의미와 게임 규칙
- T : 게임의 총 턴 수를 나타냅니다.
- A : 플레이어 1의 값을 나타냅니다.
- B : 플레이어 2의 값을 나타냅니다.
현재 턴 번호가 홀수이면 A의 값이 2배가 되고, 턴 번호가 짝수이면 B의 값이 2배가 됩니다. 모든 턴이 종료된 후 최종적으로 max(A, B) / min(A, B) 값을 계산하여 반환해야 합니다.
예제로 문제 이해하기
입력 : A = 3, B = 4, T = 3
출력 : 1
설명 :
1번째 턴 : 턴 번호가 홀수이므로 A가 2배가 됨 → A = 6
2번째 턴 : 턴 번호가 짝수이므로 B가 2배가 됨 → B = 8
3번째 턴 : 턴 번호가 홀수이므로 A가 2배가 됨 → A = 12
모든 턴이 끝난 후의 값은 A = 12, B = 8입니다.
max(A, B) = max(12, 8) = 12
min(A, B) = min(12, 8) = 8
max(A, B) / min(A, B) = 12 / 8 = 1 (정수 나눗셈)
풀이 접근 방법
1. 단순 시뮬레이션 방식
가장 직관적인 방법은 T번의 턴을 모두 반복하면서 A와 B의 값을 실제로 갱신한 뒤, 마지막에 max(A, B) / min(A, B)를 계산하는 것입니다. 이 방법은 O(T)의 시간이 걸리므로 T가 매우 큰 경우에는 비효율적일 수 있습니다.
2. 최적화된 수학적 접근
턴을 하나하나 시뮬레이션하지 않고도 결과를 바로 도출할 수 있습니다. 핵심 아이디어는 다음과 같습니다.
T가 짝수인 경우 : A와 B는 정확히 같은 횟수(N = 2T/2)만큼 곱해집니다. 즉, 새로운 값은 각각 N*A와 N*B가 되며, 공통 인수 N이 약분되기 때문에 결괏값은 항상 일정합니다.
결괏값 = max(A, B) / min(A, B)
T가 홀수인 경우 : A는 한 번 더 곱해져 2*N*A가 되고, B는 N*B가 됩니다(N = 2(T-1)/2). 따라서 결괏값은 다음과 같습니다.
결괏값 = max(2A, B) / min(2A, B)
정리하면 문제의 최종 결과 max(A, B) / min(A, B)는 다음과 같습니다.
T가 짝수일 때 : max(A, B) / min(A, B)
T가 홀수일 때 : max(2*A, B) / min(2*A, B)
이 접근 방식은 반복문 없이 상수 시간 O(1) 안에 정답을 구할 수 있다는 점에서 훨씬 효율적입니다.
풀이 동작을 보여주는 프로그램
예제 코드
#include <iostream>
using namespace std;
int EvenOddGame(int A, int B, int T) {
if (T % 2 == 0)
return (max(A, B) / min(A, B));
else
return (max(2*A, B) / min(2*A, B));
return -1;
}
int main() {
int A = 3, B = 2, T = 3;
cout<<"짝수-홀수 게임의 반환값은 "<<EvenOddGame(A, B, T);
}
출력 −
짝수-홀수 게임의 반환값은 3