일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ssd
- 실전알고리즘
- MySQL
- 머신러닝
- 그리디
- ubuntu
- 3단계
- 파이썬
- 모두를 위한 딥러닝 강좌 시즌1
- 백준
- 이것이 코딩테스트다 with 파이썬
- STL
- test-helper
- CS231n
- 1단계
- AWS
- C++
- pytorch
- SWEA
- 딥러닝
- Object detection
- 자료구조 및 실습
- docker
- 2단계
- 코드수행
- 구현
- Python
- 프로그래머스
- cs
- 전산기초
- Today
- Total
곰퓨타의 SW 이야기
[프로그래머스 level3 등굣길] dp 뿌시기! 본문
해결해야하는 문제는 다음과 같았다.
https://programmers.co.kr/learn/courses/30/lessons/42898
코딩테스트 연습 - 등굣길
계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다. 아래 그림은 m =
programmers.co.kr
이 문제는 ,, 딱 보자마자 고등학교 때 배웠던 최단 경로 찾기 방법을 활용하려 하였는데,, 그냥 이 방법을 적용하면 약간의 오류가 난다.
그 이유는 아래와 오른쪽으로만 간다는 점에 유의해야하였기 때문이다!
처음에는 다음과 같은 아이디어로 접근하고자 하였다.
우선 puddle의 배열은 [col,row] 의 형태로 주어지고, 제시한 지도도 [col,row] 형태이지만 나는 [row,col] 형태가 편하기 때문에 dp_table은 nxm 의 형태로 지정하고 위와 같이 문제에 접근하였다.
하지만 이는 아래와 오른쪽으로만 간다는 조건을 어긴 경우이다.
따라서 이를 해결하기 위해 다음과 같은 생각을 하였다.
dp_table을 처음에 시작하는 위치는 갈 수 있다는 표시로 1을 하고, 갈 수 있는 길은 0으로, 갈 수 없는 길의 경우 -1로 초기화를 한다.
이렇게 생각하게 된 이유는 웅덩이가 없어 갈 수 있는 길이더라도 아래 방향, 오른쪽 방향으로만 가는 경우에는 현재 위치에 도달할 수 없을수도 있기 때문에 갈 수 있는 길을 0, 아예 갈 수 없는 길은 -1로 초기화하도록 하였다.
그리고 첫번째 위치인 문제에서의 [1,1] -> [0,0] 은 1로 표시하여 현재 도달하였다는 의미로 1로 정의하였다.
이후 첫번쨰 칸에서부터 갈 수 있는 칸에 대해 하나씩 처리하고자 하였다.
dp_table이 -1이 아니라면 갈 수 있는 경우이다. 따라서 갈 수 있는 경우 , 왼쪽/위쪽/ 왼쪽+위쪽/ 현재값을 비교하여 가장 큰 값을 저장하도록하였다. 첫번째 행 혹은 첫번째 열인 경우에는 앞줄에서 제시한 모든 방향을 갈 수 없으므로, 경우에 따라 다르게 처리하도록 하였다.
이러한 아이디어를 바탕으로 작성한 코드는 다음과 같다.
def solution(m, n, puddles):
dp_table = [[0]*m for _ in range(n)]
dp_table[0][0] = 1
for col,row in puddles :
dp_table[row-1][col-1] = -1
for row in range(n):
for col in range(m):
if dp_table[row][col] != -1:
if row == 0 and col == 0:
pass
elif row == 0 :
dp_table[row][col] = max(dp_table[row][col], dp_table[row][col-1])
elif col == 0:
dp_table[row][col] = max(dp_table[row][col], dp_table[row-1][col])
else:
dp_table[row][col] = max(dp_table[row][col], dp_table[row-1][col]+dp_table[row][col-1],
dp_table[row-1][col],dp_table[row][col-1])
return dp_table[-1][-1]%1000000007 if dp_table[-1][-1] > 0 else 0
'TIL > 프로그래머스' 카테고리의 다른 글
[프로그래머스 level3 단어 변환] dfs/bfs 활용하기 ! (0) | 2021.06.29 |
---|---|
[프로그래머스 level3 보석 쇼핑] 효율성테스트 뿌시기!(투포인터, 딕셔너리 활용하기) (0) | 2021.06.28 |
[프로그래머스 level3 이중우선순위큐] heapq 활용하기 (0) | 2021.06.25 |
[프로그래머스 level3 다단계 칫솔 판매] 딕셔너리 활용하기 (0) | 2021.06.23 |
[프로그래머스 level3 셔틀버스] 시간을 '분' 단위로 처리하기 (0) | 2021.06.22 |