-
728x90
DP - 1463, 11726, 11727, 9095, 10844, 11057, 2193, 9465, 2156, 11053, 11055, 11722, 11054, 1912, 2579, 1699, 2133, 9461, 2225, 2011, 1105
출처: https://plzrun.tistory.com/entry/알고리즘-문제풀이PS-시작하기 [plzrun's algorithm]요즘 한동안 DP문제에 손을 못대고, 최근 파이썬을 공부하게 되면서 오랜만에 풀다보니 감이 많이 떨어졌다. 문제 접근까지는 비슷하게 갔는데, 마지막 계단을 반드시 밟는다는 조건을 못 풀고 있었다. 다른 분의 풀이를 참고해보니 역순으로 접근하면 되는 것... 이전에도 유사한 문제가 있었는데 내가 아예 까먹은 것 같다..ㅠㅠ
처음에는 시작하는 위치에서 증가하는 방향으로 행동을 Select, Not 2개로 정의한 뒤, 경우의 수를 쭉 나열해보고 Not select를 하는 순간부터 연속 select 조건이 사라지므로 SSN, SN, N으로 세 가지로 추려냈다. 그리고 조건 중 마지막 계단을 반드시 밟는 다는 조건에서 헤매다가 결국 다른 분의 풀이를 참고했다.
https://limkydev.tistory.com/121<정답 풀이>
12345678910111213141516171819202122232425262728293031323334package dp;public class N2579 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int arr[] = new int[n+1];int dp[] = new int[n+1];for(int i=1;i<=n;i++) {arr[i] = sc.nextInt();}dp[1] = arr[1];if(n>=2) {dp[2] = arr[1]+arr[2];}for(int i=3;i<=n;i++) {}System.out.print(dp[n]);}}Colored by Color Scripter내 첫 접근방식과 가장 크게 다른 부분은 기준점을 마지막 계단으로 잡고, 그 이전 계단들의 액션을 케이스로 나눠 접근한다는 점이다. 이런 식으로 접근하면 마지막 계단을 반드시 밟는다는 조건을 쉽게 만족시킬 수 있다.
마지막 계단(n번째)을 밟는다면,
1) n-1번째 계단을 밟지 않고 n번 계단만 밟는 경우,
2) n-1번도 밟고, n번 계단만 밟는 경우
두 가지 경우의 수가 있다.1)의 경우 n-2번은 반드시 밟았을 것이므로 dp[n] = dp[n-2] + arr[n]이라는 점화식을 세울 수 있고,
2)의 경우 n-2번을 반드시 밟지 않고, n-3번 계단을 반드시 밟았을 것이므로 dp[n] = dp[n-3] + arr[n-1] +arr[n]이라는 점화식을 세울 수 있다.점화식을 코드에 옮기는 건 아주 간단한 일인데, 이 과정에서 한 가지 이슈가 있었다.
arr과 dp 배열을 크기 n으로 생성하면 문제가 발생한다. (arr[0]부터 값을 받아 마지막 계단이 arr[n-1]인 경우)만약 그렇게 코드를 짜게되면 24-25라인에서 for문은 index 2부터 돌아주는 걸로 수정을 해줘야 하는데(3번째 값이 index 2에 들어가니까)이 경우 dp[i-3]이 out of bounds 이슈가 생긴다. dp[-1]이란게 없으니 당연한 결과...
따라서 이 풀이는 index 1부터 n까지 받는 형식으로 arr과 dp 배열을 만들고 써줘야 한다.
(이게 더 편하기도 하고!)Github: https://github.com/jaeuk9407/AlgorithmBOJ
'Algorithms' 카테고리의 다른 글
[백준 알고리즘] 10972번 Python 풀이 (0) 2021.01.08 [백준 알고리즘] 1167번 Python 풀이 (0) 2021.01.01 [백준 알고리즘] (DP&DC) 1912번 Java 풀이 (0) 2020.04.03 [백준 알고리즘] (DP) 11054번 Java 풀이 (0) 2020.03.30 [백준 알고리즘] (DP) 11722번 Java 풀이 (0) 2020.03.30 댓글