코딩테스트 대비/프로그래머스
프로그래머스 LV3 등굣길
JellyApple
2023. 9. 5. 13:12
문제 유형 : 동적계획법 (DP)
문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42898
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제 해결 법
- 미로찾기와 비슷한 문제라고 생각해서 그렇게 풀려고 했다. 그런데 몇 년전에 풀었던 DFS 미로찾기 문제 때 했던 방식이 생각이 나질 않았다...! 역시 복습을 안하면 안될 것 같다라는 생각을 했다.
- 먼저 생각한 풀이에서는 오른쪽으로 가면 (i+1,j) , 아래로 가면 (i,j+1)인 것을 생각했고 이 과정을 저장해가며 이어가는 방식을 사용해야 함을 알았다.
- 그래서 웅덩이가 없다는 조건 하에 오른쪽과 아래로 갈 때만이 최단거리이므로 이 과정을 나누어서 계산했다. 그리고 각각의 경우에서 count를 더해주는 조건을 생각했다. 그 후 count 값 중 최소값을 result_count에 더해주려고 했다.
- 결과적으로 위 과정을 나눌 필요가 없었고 count 대신 동적계획법으로 저장해두는 방식을 사용해야 함을 깨달았다.
- 그런데 웅덩이 조건을 어떻게 제약 할 지를 몰라 한참 헤맸고 결과적으로 구글링의 도움을 얻게 되었다..
- 집 = 1 , 길 = 0 , 웅덩이 = -1 로 설정해주었다. 그래서 길을 지날 때는 0이기 때문에 이런 식으로 진행하면 미로 찾기와 동일하게 경로를 계산할 수 있었다. 웅덩이를 -1 (꼭 -1이 아니여도 될 것 같다) 로 설정해주고 웅덩이를 만났을 때는 count 하지 않도록 continue 해주었다. 그리고 다음 덧셈에 영향이 가지 않게 기존 -1 처리 된 것을 0으로 바꾸어 주었다.(Feedback)
2. 에러 결과
=> arr[i][j] == -1 일 때 그냥 continue를 해주어서 빠져 나갔더니 다음 덧셈 결과에 -1 로 시작해서 지장이 생긴 것 같았다. 그래서 arr[i][j] = 0 으로 길 처럼 초기화 해주었다.
=> 그리고 이 에러 이전에 indexError가 발생했던 것은 arr 배열 초기화로 해결해주었다. 꼭 주어진 범위를 지정해서 초기화 해줘야함을 깨달았다.
3. 최종 코드
def solution(m, n, puddles):
answer = 0
arr = [[0] * (m+1) for _ in range(n+1)]
arr[1][1] = 1
for j,i in puddles :
arr[i][j] = -1
for i in range(1, n+1):
for j in range(1,m+1):
if arr[i][j]==-1:
arr[i][j] = 0
continue
else:
arr[i][j] += arr[i-1][j] + arr[i][j-1]
answer = arr[i][j] % 1000000007
return answer
4. Feedback
- 미로찾기를 해결했던 방식이 생각나질 않았다. 문제를 어떻게 구현 할 지는 머릿속으로는 알겠는데 코드로 구현하기 너무 어려웠다. dfs, bfs는 자료구조 시간에 과제로도 진행했던 만큼 까먹지 말도록 복습 하도록 하자
- 이런 m,n 처럼 범위가 정해진 미로 찾기나 경우의 수를 따지려 할 때는 항상 배열을 초기화 하는 습관을 가지자
arr = [[0] * (m+1) for _ in range(n+1)] - 끝까지 코드는 작성해보고 그 뒤로 구글링을 하자. 오늘 웅덩이 제약 조건이 생각나질 않아서 그 조건 빼고 코딩을 한 후 채점 후에 구글링을 하니 이해가 더 빨리 되었다. 몰라도 시간 제한 걸고 끝까지 시도해보는 습관과 끈기를 가지자.
[프로그래머스] 등굣길 / Python / 다이나믹 프로그래밍(DP)
계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다.
velog.io