2021 POSTECH Programming Open Contest 풀이
A   [BOJ 23813] 회전
B   [BOJ 23814] 아 저는 볶음밥이요
C   [BOJ 23815] 똥게임
D   [BOJ 23816] 옷걸이걸이걸이
E   [BOJ 23817] 포항항
F   [BOJ 23818] 원수의 원수
G   [BOJ 23819] 묻고 더블로 마셔
H   [BOJ 23820] MEX

1. 문제

$23815$. 똥게임 (2021 POSTECH Programming Open Contest C번)

백준 23815번 - 똥게임 (https://www.acmicpc.net/problem/23815)

2. 풀이

여러 가지 선택지 중 하나를 선택해가며 최적의 결과값을 찾는 문제라서 다이나믹 프로그래밍(DP)으로 푼다.

할 수 있는 행동은 세 가지가 있다.

  1. 첫 번째 선택지를 선택하는 경우
  2. 두 번째 선택지를 선택하는 경우
  3. 선택지를 건너뛰는 경우

선택지를 건너뛰게 되면, 선택지를 건너뛰지 않은 값과 선택지를 한번 건너뛴 값들이 구분이 되어야 한다. 그래야 선택지를 이미 한번 건너뛴 값들이 다시는 선택지를 건너뛰지 못한다.

첫 번째 선택지를 선택하는 경우와 두 번째 선택지를 선택하는 경우는 구분해도 상관은 없지만, 둘 다 선택지를 건너뛰지 않는 경우이므로 바로 maximum을 구해서 하나의 케이스로 통합할 수도 있다.

$dp[i][0] \rightarrow$ $i$번째까지 선택하며 선택지를 건너뛴 적 없는 최댓값 (코드 51줄)

이전까지 선택지를 건너뛰지 않았어야 하기 때문에 $dp[i-1][0]$에서 첫 번째 선택지를 선택한 경우와 두 번째 선택지를 선택한 경우 중 최댓값을 구한다.

$dp[i][1] \rightarrow$ $i$번째까지 선택하며 선택지를 한번 건너뛴 최댓값 (코드 52줄)

$i-1$번째까지는 건너뛰지 않았다가 $i$번째에서 건너뛰는 경우($dp[i-1][0]$), $i-1$번째 기준 이미 한 번 건너뛴 경우($dp[i-1][1]$)에서 첫 번째 선택지를 선택한 경우와 두 번째 선택지를 선택한 경우 (총 세 가지) 중 최댓값을 구한다.

계산할 때, $0$ 이하의 값은 게임 오버이므로 $0$으로 통일하여 처리한다. (코드 30줄)

3. 채점 결과

boj-23815

4. 회고

dp 계산에 들어가는 값을 잘못 정리해서, 게임 오버 $0$ 처리를 잘못해서 WA를 받았다.

5. 코드

댓글남기기