본문 바로가기

PS/BaekJoon

[백준/c++] 25592 바둑돌 게임


 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.


금요일이기도 해서 쉬운 문제로 자존감만 채우자 했는데, 퇴근 10분전에 타임어택식으로 문제를 해결하려고 접근했습니다. 근데 생각보다 어려운 문제였습니다.

저만 어려웠는지 모르겠지만, 해당 문제는 이러합니다.

푸앙이라는 친구는 첫번째로 돌을 가져가는데 일단 1개를 가져간다고 합니다. 근데 상대방은 이전에 푸앙이 가져갔던것 보다 1개를 더 가져가게 됩니다. 그렇게 된다면? 1개 2개 3개 4개를 홀수번에는 푸앙이 짝수번에는 상대방이 가져가게 됩니다.

그렇다면 푸앙은 어떻게 바둑돌을 추가해서 본인이 이기게끔 만들 수 있을까요?

푸앙이 이길 수 있는 방법은 두가지가 존재합니다.

내 차례에 내가 가져갈 돌이 정확히 내가 원하는 만큼만 있다면? 푸앙은 돌을 추가하지 않고 이길 수 있습니다. 그렇지만? 푸앙 차례에 돌이 부족하다면? 현재 돌에 내가 원하는 개수만큼을 뺀 만큼만 더하면 최소한으로 돌을 가져가서 이길 수 있습니다.

그렇다면? 상대방이 돌이 부족하다면 어떻게 될까요? 그냥 푸앙은 이기게 되는 것입니다. 이렇게 두가지 경우의 수가 있기 때문에 이를 구현해주면 됩니다. 저는 괜히 복잡하게 조건을 생각하다가 10분이라는 시간이 후다닥 지나가 버려서 집에와서 다시 문제를 천천히 해결해보니 단 두가지면 충분했습니다.

아래는 정답 코드입니다.

#include<iostream>

using namespace std;

int main() {
	
	int n; cin >> n;
	
	int chk = 0, answer = 0;
	int temp = n;
	
	for(int i = 1; i <= n; i++){
		
		if(i % 2 == 1){
			
			if(temp - i < 0){
				answer = abs(temp - i);
				chk = 1;
			}
			
		} else{
			
			if(temp - i < 0){
				answer = 0;
				chk = 1;
			}
			
		}
		
		temp -= i;
		
		if(chk) break;
		
	}
	
	cout << answer;
	
	
	return 0;
}

'PS > BaekJoon' 카테고리의 다른 글

[C++/1522] 문자열 교환  (0) 2024.05.21
[백준/C++] 16943 숫자재배치  (0) 2024.05.08
[백준/C++] 16974 레벨 햄버거  (0) 2024.04.25
[백준/C++] 5911 선물  (0) 2024.04.23
[백준/C++] 14728 벼락치기  (0) 2024.04.14