문제
https://programmers.co.kr/learn/courses/30/lessons/42898#
풀이
- 전체를 -1로 초기화
- puddles 를 0으로 만든다.
- 첫번째 행부터 순회하며 각 경우의 수를 저장한다.
def solution(m, n, puddles):
grid = [[-1] * m for _ in range(n)]
if m > 0: # (1,0) (0,1) 초기화
grid[1][0] = 1
if n > 0:
grid[0][1] = 1
for i, j in puddles: #웅덩이를 지나는 것은 불가
grid[j-1][i-1] = 0
for i in range(n):
for j in range(m):
if grid[i][j] != -1 or i + j == 0: #웅덩이와 집은 계산하지 않음
continue
if i == 0:
grid[i][j] = grid[i][j-1]
if j == 0:
grid[i][j] = grid[i-1][j]
if i != 0 and j != 0: #위쪽과 왼쪽의 경우의 수를 합
grid[i][j] = grid[i-1][j] + grid[i][j-1]
return grid[n-1][m-1] % 1000000007
로직은 쉽게 떠올랐는데 예외처리에서 조금 시간을 썼다.
그리고 웅덩이 좌표가 (m,n)인데 처음에 (n,m)으로 잘못 계산해서 고치는데 시간이 좀 걸렸다..
문제를 잘 읽자.
시간복잡도는 O(n*m)이다.
다른 사람의 풀이
def solution(m,n,puddles):
grid = [[0]*(m+1) for i in range(n+1)] #왼쪽, 위로 한줄씩 만들어서 IndexError 방지
if puddles != [[]]: #물이 잠긴 지역이 0일 수 있음
for a, b in puddles:
grid[b][a] = -1 #미리 -1로 체크
grid[1][1] = 1
for j in range(1,n+1):
for k in range(1,m+1):
if j == k == 1: #(1,1)은 1로 만들어두고, 0이 되지 않도록
continue
if grid[j][k] == -1: #웅덩이는 0으로 만들어 다음 덧셈 때 영향끼치지 않게
grid[j][k] = 0
continue
grid[j][k] = (grid[j][k-1] + grid[j-1][k])%1000000007 #[a,b] = [a-1,b] + [a,b-1] 공식
return grid[n][m]
로직 자체는 비슷하다.
'알고리즘 스터디' 카테고리의 다른 글
[프로그래머스] 힙 3. 이중우선순위큐 (2) | 2021.07.30 |
---|---|
[프로그래머스] 깊이/너비 우선 탐색 3. 단어 변환 (0) | 2021.07.25 |
[프로그래머스] 탐욕법 5. 섬 연결하기 (1) | 2021.07.10 |
[프로그래머스] 그래프 2. 순위 (0) | 2021.07.04 |
[프로그래머스] 동적계획법 2. 정수 삼각형 (0) | 2021.06.20 |