포스트

BOJ 30506 가위 가위 가위

sorohue가 PS하는 블로그

BOJ 30506 가위 가위 가위

문제 링크입니다.

제가 SASA Programming Contest 2023에 출제한 문제입니다.

101번… 100번…

첫 대결에서 우리는 100개 모두 가위를 내고, 그때 몇 번을 이겼는지를 알고 있는 상태로 내기를 시작합니다. 그러면 남은 대결은 100번이고, 맞혀야 하는 손의 수도 100개입니다. 대충 대결 1번에 손 하나씩은 맞혀야 한다는 결론이 납니다.

그래서 이게 무슨 태그라고?

첫 손만 바위로 바꾸고 두 번째 대결을 진행해 봅시다. 머신의 첫 손 모양에 따라 다음의 세 가지 결과가 나타납니다.

  • 머신이 가위를 냈다면 : 처음에는 비겼는데 이번에는 이겼습니다. 이긴 횟수가 1 증가합니다.
  • 머신이 바위를 냈다면 : 처음에는 졌는데 이번에는 비겼습니다. 이긴 횟수는 그대로입니다.
  • 머신이 보를 냈다면 : 처음에는 이겼는데 이번에는 졌습니다. 이긴 횟수가 1 감소합니다.

머신의 손 모양의 따라 대결 결과가 모두 다르게 나타납니다! 그러니, 한 번에 손 모양 하나만 바위를 내고 나머지는 그대로 가위를 내서 대결을 진행했을 때의 결과를 첫 게임의 결과와 비교하는 것으로 머신의 각 손 모양을 바로 알아낼 수 있습니다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<bits/stdc++.h>
using namespace std;
int ans[123];

int main(){
	int k, newk; cin >> k;
	for(int i = 1; i <= 100; i++){
		cout << "? ";
		for(int j = 1; j < i; j++) cout << 2;
		cout << 0;
		for(int j = i+1; j <= 100; j++) cout << 2;
		cout << endl;
		cin >> newk;
		if(k < newk) ans[i] = 2;
		else if(k == newk) ans[i] = 0;
		else ans[i] = 5;
	}
	cout << "! ";
	for(int i = 1; i <= 100; i++) cout << ans[i];
	cout << endl;
	return 0;
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.