[BOJ 25215] 백준 25215번 - 타이핑
1. 문제
$25215$. 타이핑 (2022 인하대학교 프로그래밍 경진대회(IUPC) I번)
2. 풀이
다음과 같이 dp
를 설정할 수 있다.
$dp[i][0]$ $\rightarrow$ 현재 index $i$에서 마름모가 비활성화 상태인 경우, 버튼을 누른 최소 횟수
$1$. 현재 index(i)의 문자가 소문자인 경우 (소문자를 ch
, 이 문자의 대문자를 CH
라 지칭한다)
$\;$ 1-1. 현재 상태를 비활성화 상태로 종료하는 경우
-
이전 마름모가 비활성화 상태였던 경우,
ch
를 누르면, 비활성화 상태를 그대로 유지하면서 해당 문자를 입력할 수 있다. $\rightarrow$dp[i-1][0]+1
-
이전 마름모가 활성화 상태였던 경우, ◆를 누르고
ch
를 누르면, 해당 문자를 입력하고 비활성화 상태로 바꿀 수 있다. $\rightarrow$dp[i-1][1]+2
$\;$ 1-2. 현재 상태를 활성화 상태로 종료하는 경우
-
이전 마름모가 비활성화 상태였던 경우,
ch
를 누르고 ◆를 누르면, 해당 문자를 입력하고 활성화 상태로 바꿀 수 있다. $\rightarrow$dp[i-1][0]+2
-
이전 마름모가 활성화 상태였던 경우,
CH
를 누르고 ★을 누르면, 해당 문자가ch
로 바뀌고 활성화 상태를 유지할 수 있다. $\rightarrow$dp[i-1][1]+2
$2$. 현재 index(i)의 문자가 대문자인 경우 (소문자를 ch
, 이 문자의 대문자를 CH
라 지칭한다)
$\;$ 2-1. 현재 상태를 비활성화 상태로 종료하는 경우
-
이전 마름모가 비활성화 상태였던 경우,
ch
를 누르고 ★을 누르면, 해당 문자가CH
로 바뀌고 비활성화 상태를 유지할 수 있다. $\rightarrow$dp[i-1][0]+2
-
이전 마름모가 활성화 상태였던 경우,
CH
를 누르고 ◆을 누르면, 해당 문자를 입력하고 비활성화 상태로 바꿀 수 있다. $\rightarrow$dp[i-1][1]+2
$\;$ 2-2. 현재 상태를 활성화 상태로 종료하는 경우
-
이전 마름모가 비활성화 상태였던 경우, ◆를 누르고
CH
를 누르면, 활성화 상태로 바뀌고 해당 문자를 입력할 수 있다. $\rightarrow$dp[i-1][0]+2
-
이전 마름모가 활성화 상태였던 경우,
CH
를 한 번 누르면, 활성화 상태를 그대로 유지하면서 해당 문자를 입력할 수 있다. $\rightarrow$dp[i-1][1]+1
이를 종합하여 다음과 같은 식이 만들어진다.
// if: 현재 index(i)의 문자가 소문자인 경우
dp[i][0] = min(dp[i - 1][0] + 1, dp[i - 1][1] + 2);
dp[i][1] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 2);
// if: 현재 index(i)의 문자가 대문자인 경우
dp[i][0] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 2);
dp[i][1] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 1);
처음은 마름모가 비활성화인 상태에서 시작하기 때문에, 이에 맞춰서 초기값을 잘 설정해주어야 한다.
// if: 첫 글자가 소문자인 경우
dp[0][0] = 1;
dp[0][1] = 2;
// if: 첫 글자가 대문자인 경우
dp[0][0] = 2;
dp[0][1] = 2;
정답은 dp[len - 1][0]
와 dp[len - 1][1]
중 작은 값이다.
3. 채점 결과
4. 회고
초기값을 잘못 설정하여 WA를 받았다. 굳이 dp를 사용하지 않고, 그리디 알고리즘으로 풀 수도 있다.
댓글남기기