Betris (Small)
문제
Betris (Small) 문제는 Betris 문제와 보드의 크기, 칩의 개수, 블록 종류, 총 라운드 수, 최대 베팅 금액을 제외한 차이는 없습니다.
Betris (Small)는 크기의 보드 위에서 제시되는 폴리오미노 블록을 차지하기 위해 상대와 베팅 대결을 벌이고, 획득한 블록을 효율적으로 배치하여 보드를 채워나가는 전략 게임입니다.
1. 보드 및 구성 요소
각 플레이어는 게임이 시작할 때 비어 있는 보드 개와 베팅에 사용할 칩 개를 보유합니다.

보드는 행 열로 구성되어 있습니다. 행 번호는 위에서 아래로 행부터 행까지, 열 번호는 왼쪽에서 오른쪽으로 열부터 열까지이며, 행 열의 칸을 로 표기합니다. 칩은 이후 베팅 단계에서 사용할 수 있습니다.

게임에는 종의 폴리오미노 블록이 사용됩니다. 각 블록의 모양 및 명칭은 위와 같습니다.
2. 게임 진행
게임은 총 라운드 동안 진행됩니다. 각 라운드는 베팅 단계와 배치 단계로 나뉩니다.
1단계: 베팅 단계 (Betting Phase)
- 채점기는 종의 블록 중 하나를 균등한 확률로 선택해 로 정한 뒤, 를 제외한 종의 블록 중 하나를 균등한 확률로 선택해 로 정합니다.
- 각 플레이어는 또는 중 원하는 블록과 베팅할 칩 개수를 채점기에 전달합니다. 베팅에 사용할 칩 개수는 이상 이하여야 하며, 자신이 현재 보유하고 있는 칩 개수 이하여야 합니다.
- 두 플레이어가 원하는 블록과 칩 개수를 결정했다면, 이후 채점기는 다음 규칙에 따라 베팅 성공 여부를 플레이어에게 알려줍니다.
- 두 플레이어가 서로 다른 블록을 선택했다면, 두 플레이어 모두 베팅에 성공합니다.
- 두 플레이어가 같은 블록을 선택했고 베팅한 칩 개수가 다르다면, 베팅한 칩 개수가 더 많은 플레이어가 베팅에 성공합니다.
- 두 플레이어가 같은 블록을 선택했고 베팅한 칩 개수가 같다면, 채점기가 무작위로 고른 한 플레이어가 베팅에 성공합니다.
- 베팅에 성공한 플레이어는 자신이 원하는 블록을 획득하며, 자신이 베팅한 칩 개수만큼의 칩을 지불합니다.
- 베팅에 실패한 플레이어는 자신이 원하지 않은 블록을 획득하며, 칩을 지불하지 않습니다.
2단계: 배치 단계 (Placement Phase)
- 각 플레이어는 획득한 블록을 원하는 만큼 시계 방향으로 회전시킬 수 있습니다.
- 각 플레이어는 획득한 블록을 원하는 만큼 좌우로 대칭시킬 수 있습니다.
- 이후 플레이어는 보드에 블록을 배치하거나 패스를 선택할 수 있습니다.
- 배치를 선택하면 블록은 보드를 벗어나지 않으면서 다른 블록이 차지하지 않은 칸에 배치되어야 합니다.
- 블록을 배치할 공간이 있더라도 배치하지 않는 것이 유리하다고 판단되면 패스를 선택할 수 있습니다.
3. 점수 산정
모든 라운드가 종료된 후, 각 플레이어의 점수는 다음과 같이 계산됩니다.
- 보드에서 블록이 차지하고 있는 칸의 개수당 점을 획득합니다.
- 보드 위의 채워진 칸으로만 만들 수 있는 가장 큰 정사각형의 칸의 개수당 점을 획득합니다.
- 남은 칩 개수당 점을 획득합니다.
예를 들어, 다음과 같은 경우 플레이어의 점수는 점입니다.

최종 승자는 점수가 더 높은 플레이어이며, 점수가 같다면 무승부입니다.
입력
채점기는 다음의 한 줄 단위로 플레이어와 통신합니다.
| 명령어 | 채점기→플레이어 (입력) | 플레이어→채점기 (출력) | 시간 제한 (ms) | 설명 |
|---|---|---|---|---|
| READY | READY |
OK |
3000 |
게임의 시작을 알립니다. |
| PHASE1 | PHASE1 A B my_time opp_time |
BET C x |
my_time |
채점기가 선택한 블록 쌍 와 나와 상대의 남은 시간을 알립니다. 이번 턴에 내가 선택한 블록과 베팅한 칩 개수를 출력합니다. |
| PHASE2 | PHASE2 C my_chip opp_chip my_time opp_time |
PLACE k x1 y1 ... xk yk |
my_time |
베팅 단계가 끝난 뒤, 내가 획득한 블록, 나와 상대의 남은 칩 개수와 시간을 알립니다. 이후 배치 단계에서 배치를 선택했다면, 새로 배치한 블록이 차지하는 칸의 개수와 좌표를 출력합니다. 패스를 선택했다면 PLACE 0을 출력합니다. |
| OPP | OPP k x1 y1 ... xk yk |
- | - | 배치 단계가 끝난 뒤, 상대가 출력한 k x1 y1 ... xk yk를 알립니다. |
| FINISH | FINISH |
- | - | 게임 종료를 알립니다. 플레이어는 추가 출력 없이 프로그램을 정상 종료해야 합니다. |
READY 명령어는 라운드가 시작하기 전에 한 번 주어지며, FINISH 명령어는 라운드가 끝난 뒤에 한 번 주어집니다.
PHASE1, PHASE2, OPP 명령어는 각 라운드마다 순서대로 한 번씩 주어집니다.
PHASE1의 명령어의 입력은 다음의 조건을 만족하며, 출력은 다음의 조건을 만족해야 합니다.
- 입력의
A,B는I1,I2,I3,L3중 하나입니다. - 입력의
A,B는 서로 다릅니다. - 출력의
C는 입력으로 주어진A,B중 하나여야 합니다. - 출력의
x는 이상 이하의 정수여야 하며, 내가 가진 칩 개수를 넘으면 안됩니다.
PHASE2의 명령어의 입력은 다음의 조건을 만족하며, 출력은 다음의 조건을 만족해야 합니다.
- 입력의
C는 이전 베팅 단계에서 입력으로 주어진A,B중 하나입니다. - 출력의
k x1 y1 ... xk yk는 단일 공백으로 구분된 개의 정수여야 합니다. - 인 경우 는
C의 칸 개수여야 합니다. - 인 경우 이어지는 개의 정수는 차례로 배치 단계에서 블록이 배치되는 서로 다른 개 칸의 좌표 를 의미해야 하며, 규칙에 맞게 플레이할 때
C를 해당 위치에 배치할 수 있어야 합니다.
모든 명령어에서 입력은 다음의 조건을 만족하며, 출력은 다음의 조건을 만족해야 합니다.
my_chip,opp_chip은 정수입니다.my_time,opp_time은 정수이며, 시간은 밀리초(millisecond) 단위로 주어집니다.- 모든 출력 후에는 개행문자를 출력한 뒤 버퍼를 flush해야 합니다.
- 시간 제한이 있는 명령에서 출력을 제한 내에 수행하지 않으면 시간 초과(
TLE) 판정을 받습니다. - 출력 형식에 맞지 않는 문자열을 출력하면 런타임 에러(
RE) 판정을 받습니다.
예시
| P1 입력 | P1 출력 | P2 입력 | P2 출력 |
|---|---|---|---|
READY |
READY |
||
OK |
OK |
||
PHASE1 I2 I3 10000 10000 |
PHASE1 I2 I3 10000 10000 |
||
BET I3 1 |
BET I3 1 |
||
PHASE2 I3 7 8 9999 9999 |
PHASE2 I2 8 7 9999 9999 |
||
PLACE 3 1 1 1 2 1 3 |
PLACE 2 1 1 1 2 |
||
OPP 2 1 1 1 2 |
OPP 3 1 1 1 2 1 3 |
||
PHASE1 I1 I2 9998 9998 |
PHASE1 I1 I2 9998 9998 |
||
BET I1 0 |
BET I2 1 |
||
PHASE2 I1 7 7 9997 9997 |
PHASE2 I2 7 7 9997 9997 |
||
PLACE 1 2 1 |
PLACE 2 1 3 2 3 |
||
OPP 2 1 3 2 3 |
OPP 1 2 1 |
||
FINISH |
FINISH |
샘플 코드
- C20 : sample.c
- CPP20 : sample.cpp
- PYTHON3, PYPY3 : sample.py
제한
- 시간 : 각 플레이어에게 주어지는 첫 번째 TURN 명령어에서
my_time은 입니다. - 메모리 :
- 채점 환경 : HELP > 채점 환경
