2022 KAKAO TECH INTERNSHIP - 118668. 코딩 테스트 공부
[Lv. 3]
https://school.programmers.co.kr/learn/courses/30/lessons/118668
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
보자마자.. DP로 접근해야 될 것 같은 문제라고 생각했다.
[백준] 2342. Dance Dance Revolution - 파이썬 과 비슷한 느낌으로, Bottom-Up으로 풀면 된다.
dp[alp][cop]
=> 특정 alp, cop를 달성하기 위한 최소 시간(cost)
def solution(alp, cop, problems):
INF = 10**9
max_alp, max_cop = 0, 0
for p in problems:
max_alp = max(max_alp, p[0])
max_cop = max(max_cop, p[1])
# 런타임 에러 해결
if alp > max_alp:
alp = max_alp
if cop > max_cop:
cop = max_cop
dp = [[INF]*(max_cop+1) for _ in range(max_alp+1)]
dp[alp][cop] = 0
# 현재 alp부터 필요 alp까지, 현재 cop부터 필요 cop까지의 dp 배열을 memoization을 이용해 채워 나감.
for i in range(alp, max_alp+1):
for j in range(cop, max_cop+1):
if i < max_alp:
dp[i+1][j] = min(dp[i+1][j], dp[i][j] + 1)
if j < max_cop:
dp[i][j+1] = min(dp[i][j+1], dp[i][j] + 1)
for p in problems:
if i >= p[0] and j >= p[1]:
alp_n = i+p[2]
cop_n = j+p[3]
# 필요 범위(배열 범위 밖)으로 넘어가면, max값으로 줄여줌.
if alp_n > max_alp:
alp_n = max_alp
if cop_n > max_cop:
cop_n = max_cop
# 최솟값 최신화!
dp[alp_n][cop_n] = min(dp[alp_n][cop_n], dp[i][j]+p[4])
return dp[max_alp][max_cop]