본문 바로가기
알고리즘/프로그래머스

프로그래머스-등굣길

by nyeongha 2024. 1. 15.

문제 설명

계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 있습니다.

아래 그림은 m = 4, n = 3 경우입니다.

가장 왼쪽 , 집이 있는 곳의 좌표는 (1, 1) 나타내고 가장 오른쪽 아래, 학교가 있는 곳의 좌표는 (m, n)으로 나타냅니다.

격자의 크기 m, n 물이 잠긴 지역의 좌표를 담은 2차원 배열 puddles 매개변수로 주어집니다오른쪽과 아래쪽으로만 움직여 집에서 학교까지 있는 최단경로의 개수를 1,000,000,007 나눈 나머지를 return 하도록 solution 함수를 작성해주세요.


 

제한사항

  • 격자의 크기 m, n 1 이상 100 이하인 자연수입니다.
  • 물에 잠긴 지역은 0 이상 10 이하입니다.
  • 집과 학교가 물에 잠긴 경우는 입력으로 주어지지 않습니다.

입출력

m n puddles return
4 3 [[2, 2]] 4

입출력 설명


나의 코드

처음에 bfs로 풀면 되겠지 했는데,,,

from collections import deque
def solution(m, n, puddles):
    answer = 0
    region=[[0 for i in range(m)] for j in range(n)]
    ll=[]
    dq=deque([(0,0)])
    answer=0
    while dq:
        d=[(0,1),(1,0)]
        x,y=dq.pop()
        for xx,yy in d:
            nx,ny=x+xx,y+yy
            if nx==n-1 and ny==m-1:
                ll.append(region[x][y]+1)
            if 0<=nx<n and 0<=ny<m:
                if [ny+1,nx+1] not in puddles:
                    if region[nx][ny]>0:
                        region[nx][ny]=region[x][y]+1
                    dq.append([nx,ny])
    answer=len(ll)%1000000007
    return answer

시간초과가 떴다...ㅠㅠㅠㅠ

 

최단거리 경우의 수를 찾는건 dp를 사용하는게 더 효율적인것같다.

def solution(m, n, puddles):
    answer = 0
    region=[[0 for i in range(m+1)] for j in range(n+1)]
    region[1][1]=1
    for i in range(1,n+1):
        for j in range(1,m+1):
            if i==1 and j==1 or [j,i] in puddles:
                continue
            else:
                region[i][j]=region[i-1][j]+region[i][j-1]
    answer=region[n][m]
    return answer

뭐가 문제인걸까,,,,,,다시 해봐야겠다,,,,

def solution(m, n, puddles):
    answer = 0
    region=[[0 for i in range(m+1)] for j in range(n+1)]	#가로가 m 세로가 n인 지도 그리기
    region[1][1]=1		#집위치는 1,1
    for i in range(1,n+1):		#1부터 n까지
        for j in range(1,m+1):		#1부터 m까지
            if i==1 and j==1 or [j,i] in puddles:	#집(1,1)이거나 물웅덩이(puddles)라면
                continue	#지나가기
            else:	#아니라면
                region[i][j]=region[i-1][j]+region[i][j-1]	#왼쪽,윗쪽값 더해서 최단경로수 구하기
    answer=region[n][m]%1000000007		#1,000,000,007로 나눈 나머지를 구해야하므로!!
    return answer

마지막에 '학교까지   있는 최단경로의 개수를 1,000,000,007 나눈 나머지를 return 하도록 solution 함수를 작성' 이부분을 주의깊게 보지않아서 효율성에서 문제가 난것같다....문제를 잘읽자!그리고 최단경로의 수는 무조건 dp!!!