문제 링크
- http://icpc.me/16986
문제 출처
- 2019 3/1 코딩테스트 특강 ( /Ba+rking/님 )
사용 알고리즘
- BFS
- Brute Force
풀이
3/1에 서울대학교에서 진행된 코딩테스트 특강 모의고사 문제입니다.
이 문제는 2개의 부분 문제로 나누어 풀 수 있습니다.
- 지우가 낼 순서 정하기
- 시뮬레이션 돌리기
1. 순서 정하기
지우는 1부터 N까지 N개의 수를 한 번씩 사용할 수 있습니다. 배열에 1부터 N까지 차례대로 저장하고, permutation을 돌리면 지우가 낼 순서를 모두 구할 수 있습니다.
이 작업은 O(N!)이 걸리고, N은 최대 9이므로 약 360,000개 정도의 순열에 대해 시뮬레이션을 돌리면 됩니다.
문제 하단에 나와있지만, 다른 플레이어가 앞으로 낼 손동작을 20개만 예측해도 전혀 문제가 없습니다.
Lemma 1. 각 플레이어가 앞으로 20경기에서 낼 손동작만 미리 알고 있어도 지우가 우승할 수 있는지 예측하는데 문제가 없다.
proof ) 비둘기집의 원리에 의해 3(K-1)+1, 즉 3K-2번 게임을 하면 우승자가 결정이 되는데, K는 최대 6이므로 20번의 게임만으로 우승 여부를 확정지을 수 있다.
2. 시뮬레이션 돌리기
지우가 낼 순서를 arr[1][1…N], 경희와 민호가 낼 순서를 각각 arr[2][1…20], arr[3][1…20]에 저장을 했다고 가정합시다.
지우, 경희, 민호가 몇 번째 인덱스에 저장된 손동작을 낼지 기억하는 idx배열과 몇 번 이겼는지 기억하는 win배열을 만들면 편하게 구현할 수 있습니다.
구현이 까다롭지는 않은 것으로 생각되어 설명은 코드로 대체하도록 하겠습니다. 시뮬레이션의 구현은 f() 함수 부분을 보시면 됩니다.
전체 코드
1 |
|