반응형
[level 3] 코딩 테스트 공부 - 118668
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
DP를 이용해 해당 문제를 해결할 수 있다.
먼저 가능한 선택지는 3가지 이다.
- 1시간을 사용,
alp
1 늘리기 - 1시간을 사용,
cop
1 늘리기 - 문제를 해결하여 주어진
cost
를 사용,alp_rwd
,cop_rwd
만큼 늘리기
row를 alp
, col을 cop
으로 두고 [alp][cop]
에 시간(cost
)을 저장하여 DP를 수행한다.
각 [알고력, 코딩력]에 도달하기 위한 경우의 수 중 cost가 가장 적은 것을 선택한다.
현재 [alp][cop]
에서
- 1시간을 사용,
alp
1 늘리기dp[alp+1][cop]
와dp[alp][cop]+1
을 비교하여 작은 값을 선택한다. - 1시간을 사용,
cop
1 늘리기dp[alp][cop+1]
와dp[alp][cop]+1
을 비교하여 작은 값을 선택한다. - 문제를 해결하여 주어진
cost
를 사용,alp_rwd
,cop_rwd
만큼 늘리기dp[alp+alp_wrd][cop+cop_rwd]
와dp[alp][cop]+cost
를 비교하여 작은 값을 선택한다.
* 최소 값을 비교하여 저장해야하므로, dp 배열의 초기 값을 큰 값으로 바꿔두자!
해당 과정을 거친 후 주어진 문제 중 alp_req와 cop_req가 가장 클 때의 시간을 return 한다.
코드
java
닫기import java.util.*; class Solution { public int solution(int alp, int cop, int[][] problems) { int maxal = Math.max(alp, Arrays.stream(problems).mapToInt(p -> p[0]).max().orElse(0)); int maxco = Math.max(cop, Arrays.stream(problems).mapToInt(p -> p[1]).max().orElse(0)); int[][] dp = new int[maxal + 1][maxco + 1]; Arrays.stream(dp).forEach(i -> Arrays.fill(i, 3151)); //dp배열 큰 값으로 초기화 dp[alp][cop] = 0; // 시작점 초기화 for (int al = alp; al <= maxal; al++) { for (int co = cop; co <= maxco; co++) { // 한 시간씩 기다려서 alp 또는 cop 1 증가 if (al < maxal) dp[al + 1][co] = Math.min(dp[al + 1][co], dp[al][co] + 1); if (co < maxco) dp[al][co + 1] = Math.min(dp[al][co + 1], dp[al][co] + 1); // 문제 풀었을 때 경험치 증가 for (int[] p : problems) { if (al >= p[0] && co >= p[1]) { int a = Math.min(maxal, al + p[2]); int c = Math.min(maxco, co + p[3]); dp[a][c] = Math.min(dp[a][c], dp[al][co] + p[4]); } } } } return dp[maxal][maxco]; } }
728x90
반응형
'코딩 테스트 정복기 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/level 3] 파괴되지 않은 건물 - 92344 (+누적합, Java) (0) | 2025.02.11 |
---|---|
[프로그래머스/level 4] 지형 이동 - 62050 (Java) (0) | 2024.12.20 |
[프로그래머스/level 3] 외벽 점검 - 60062 (0) | 2024.12.15 |
[프로그래머스/level 2] 피로도 - 87946 (0) | 2024.12.10 |
[프로그래머스/level 2] 양궁대회 - 92342 (1) | 2024.12.06 |