문제 정보
문제: 28489번: 2048 게임
제한:
- 시간 제한: 15초 (추가 시간 없음)
- 메모리 제한: 1024 MB
- 제출 수: 1145, 정답 수: 53
문제 요약: 인터랙터가 제공하는 위치에 타일 2를 배치한 후, UP/DOWN/LEFT/RIGHT 중 한 방향으로 이동 명령을 내각. 게임 종료 시점의 최댓값 타일로 점수를 얻고, 16회 실행 평균이 2048 이상이면 정답 판정.
입출력 형식 및 예제
인터랙션 방식:
| |
예제:
| |
접근 개요 (핵심 관찰)
- 게임 구조: 플레이어(최적 이동 선택) ↔ 환경(무작위 타일 생성)의 교대 턴
- 핵심 인사이트: 타일 생성 위치는 무작위이지만, 값은 항상 2. 따라서 확률 노드를 포함하는 게임 트리 탐색(Expectimax)이 적합
- 평가 지표: 깊이 제약 때문에 리프 노드에서 Snake 패턴 휴리스틱으로 보드 상태 평가
Mermaid 흐름도:
graph TD
A["현재 보드 상태
(Player Turn)"]
A -->|방향 4개| B["다음 보드
(Chance Turn)"]
B -->|빈칸 전부| C["각 빈칸에
타일 2 배치"]
C -->|평균| D["기댓값 계산"]
D -->|최댓값 선택| E["최적 방향 결정"]
style A fill:#FFE6E6
style E fill:#E6FFE6
알고리즘 설계
Expectimax 트리 탐색
Max Node (플레이어 턴):
- 상, 하, 좌, 우 이동 시뮬레이션
- 실제 이동이 일어난 경우만 Chance Node로 진행
- 자식 노드의 기댓값 중 최댓값 선택
Chance Node (환경 턴):
- 현재 보드의 모든 빈칸 탐색
- 각 빈칸에 2를 배치 후 Max Node로 진행
- 모든 경우의 평균 계산
깊이: 약 5-6 (3수 앞 탐색으로 충분한 시간 내 응답)
보드 상태 평가 (휴리스틱)
Snake 패턴 가중치:
- 큰 숫자가 좌상단 (0,0)에 모이도록 유도
- 오른쪽 → 아래 → 왼쪽 → 위 순서의 가중치 배치
- 높은 타일 값이 자주 사용되는 위치에 높은 가중치
| |
타일 이동/병합 로직
| |
정당성 근거
- Expectimax의 최적성: 플레이어와 확률 환경이 번갈아 나타나는 게임에 대해 최적 정책을 보장
- 휴리스틱의 유효성: Snake 패턴은 2048 게임에서 경험적으로 가장 높은 점수를 유도하는 평가 함수
- 깊이 설정: 15초 제한 내에 충분히 깊은 탐색으로 안정적 플레이 가능
복잡도
- 시간: \(O(4^d \times b^c)\) - \(d\): 탐색 깊이(~5), \(b\): 이동 갈래(≤4), \(c\): 평균 빈칸 수(≤16)
- 공간: \(O(d \times 16)\) - 보드 복사본 스택, 상수 추가 메모리
구현
| |
코너 케이스 체크리스트
| 케이스 | 설명 | 처리 |
|---|---|---|
| 모든 방향 불가 | 게임 종료 조건 | 임의 방향 출력 후 반환 |
| 보드 가득 참 | 빈칸 0개 → 이동 불가 | Chance 노드에서 평가값 반환 |
| 단일 타일 | 초기 상태 이후 처음 이동 | 모든 방향에서 이동 가능 |
| 병합 연쇄 | 같은 값 4개 → 2번 병합 | 각 단계마다 한 번씩만 병합 |
제출 전 점검
- 입출력 형식: “UP”/“DOWN”/“LEFT”/“RIGHT” 정확히 입력
- 종료 조건: -1 입력 시 프로그램 즉시 종료
- 이동 불가능성: 실제 이동이 일어난 경우만 탐색
- 좌표 변환: \(P = 4(i-1) + j+1\) ↔ \(i = \lfloor(P-1)/4\rfloor, j = (P-1) \bmod 4\)
- 오버플로우: double 사용으로 충분, 합병 결과는 정수
- 배열 초기화: 각 round 진행 시 board는 누적됨 (reset 불필요)
유사 문제
- BOJ 17693 항구 시설 (Port Facility): 인터랙티브 그래프 탐색
- BOJ 16783 불도저 (Bulldozer): 2D 기하 + 인터랙션
![Featured image of post [Algorithm] C++ 백준 28489번 2048 게임 AI](/post/algorithm/2025-12-04-boj-28489-2048-game-cpp-solution/wordcloud_hu_531906c7094ae509.png)
![[Algorithm] C++ 백준 18526번: Bomas](/post/algorithm/2025-12-04-boj-18526-bomas-cpp-solution/wordcloud_hu_e648c602797aff58.png)
![[Algorithm] C++ 백준 23575번: Squid Game](/post/algorithm/2025-12-04-boj-23575-squid-game-cpp-solution/wordcloud_hu_3623649df8b22837.png)
![[Algorithm] C++ 백준 28489번 2048 게임 AI](/post/algorithm/2025-12-04-boj-28489-2048-game-cpp-solution/wordcloud_hu_b6e287ec8ff9c5cc.png)
![[Algorithm] C++ 백준 29200번: 문제 수 줄이기](/post/algorithm/2025-12-04-boj-29200-reducing-number-of-problems-cpp-solution/wordcloud_hu_fd4b355f9734e4d4.png)
![[Algorithm] C++ 백준 16481번 원 전문가 진우 - 방접원과 내접원의 관계](/post/algorithm/2025-12-03-boj-16481-excircle-incircle-geometry-cpp-solution/wordcloud_hu_ee675f3393f22f00.png)
![[Algorithm] C++ 백준 18186번: 라면 사기 (Large)](/post/algorithm/2025-09-04-boj-18186-ramen-buying-large-greedy-cpp-solution/wordcloud_hu_2d2533b219761dcf.png)
![[Algorithm] C++ 백준 16496번: 큰 수 만들기](/post/algorithm/2025-12-02-boj-16496-largest-number-greedy-sorting-cpp-solution/wordcloud_hu_9f9372bd1ae0bc2e.png)
![[Algorithm] C++ 백준 1725번: 히스토그램](/post/algorithm/2025-12-02-boj-1725-histogram-maxarea-stack-cpp-solution/wordcloud_hu_a9b77b8cde0366cb.png)
![[Algorithm] C++ 백준 11717번: Wall Making Game](/post/algorithm/2025-08-14-boj-11717-wall-making-game-cpp-solution/wordcloud_hu_ab6ea20a268c378a.png)
![[Algorithm] C++ 백준 14166번: 로봇 소 무리 (Robotic Cow Herd)](/post/algorithm/2025-08-14-boj-14166-robotic-cow-herd-fracturing-search-cpp-solution/wordcloud_hu_5aaf3b397594e585.png)