[Programmers] P118668 코딩 테스트 공부
[Programmers] P118668 코딩 테스트 공부
Question
Language: Python
알고력, 코딩력을 변수로 설정해서 이에 대한 DP 방식으로 접근한다.
dp=[[inf] * (req_cop+1) for _ in range((req_alp+1))]
알고 공부 및, 코딩 공부
#알고 공부
if i +1 <=req_alp:
dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1)
#코딩 공부
if j +1 <=req_cop:
dp[i][j+1]=min(dp[i][j+1],dp[i][j]+1)
문제 풀이
for alp_req, cop_req, alp_rwd, cop_rwd, cost in problems:
#문제를 풀수 있는 조건이 만족되면, 저장되어 있는 cost와 비교해서 갱신
if i>=alp_req and j >=cop_req:
next_alp=min(req_alp,i+alp_rwd)
next_cop=min(req_cop,j+cop_rwd)
dp[next_alp][next_cop]=min(dp[next_alp][next_cop],dp[i][j]+cost)
실수한 부분
해당 문제를 처음에는 recursion으로 접근해서 들어갔는데, 그렇게 하면 코딩 공부, 알고리즘 공부로 인해 재귀함수의 깊이가 상당히 싶어진다. 따라서, 이를 효율적으로 풀기 위해 DP 방식으로 접근해야한다.
–> 알고보면 간단한 DP 문제인데, 왜 재귀함수로 접근했을까…..
Solution
from math import inf
def solution(alp, cop, problems):
req_alp,req_cop=0,0
answer = 0
#모든 문제를 풀기 위한 알고력, 코딩력 최소 요구량을 구한다.
for alp_req, cop_req, alp_rwd, cop_rwd, cost in problems:
req_alp=max(req_alp,alp_req)
req_cop=max(req_cop,cop_req)
#초기 알고력, 코딩력이 요구하는 알고력, 코딩력 보다 높을 수 있다
alp=min(alp,req_alp)
cop=min(cop,req_cop)
#알고력, 코딩력에 관한 dp 배열 설정
dp=[[inf] * (req_cop+1) for _ in range((req_alp+1))]
#초기 알고력, 코딩력
dp[alp][cop]=0
for i in range(alp,req_alp+1):
for j in range(cop, req_cop+1):
#알고 공부
if i +1 <=req_alp:
dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1)
#코딩 공부
if j +1 <=req_cop:
dp[i][j+1]=min(dp[i][j+1],dp[i][j]+1)
for alp_req, cop_req, alp_rwd, cop_rwd, cost in problems:
#문제를 풀수 있는 조건이 만족되면, 저장되어 있는 cost와 비교해서 갱신
if i>=alp_req and j >=cop_req:
next_alp=min(req_alp,i+alp_rwd)
next_cop=min(req_cop,j+cop_rwd)
dp[next_alp][next_cop]=min(dp[next_alp][next_cop],dp[i][j]+cost)
answer=dp[-1][-1]
return answer
댓글남기기