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 라이센스를 따릅니다.