알고리즘/알고리즘 문제 풀이

[프로그래머스 Lv.3] 등굣길 (Python)

용꿀 2024. 7. 27. 16:26

문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42898

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

최단거리만 세면 되기에, 특정 칸에 진입할 수 있는 방법은 왼쪽 또는 위쪽으로 한정된다. 그렇기에 현재 칸에 도달할 수 있는 방법의 수는 현재의 왼쪽에 위치한 칸까지 도달할 수 있는 방법의 수와 현재의 위쪽에 위치한 칸까지 도달할 수 있는 방법의 수를 더한 값이다.

결론적으로 이전 값을 기반으로 하여 현재 값을 갱신해나가는 풀이가 진행되기에 DP로 이 문제를 풀이할 수 있다.

def solution(m, n, puddles):
    arr = [[0 for _ in range(m)] for _ in range(n)]

    def check(i, j): # 체크 대상 칸이 도달할 수 있는 칸인지 체크하는 함수
        is_i_valid = 0 <= i < n # 도달할 수 있는 열인지
        is_j_valid = 0 <= j < m # 도달할 수 있는 행인지
        is_not_puddle = arr[i][j] != -1 # 물에 잠긴 칸이 아닌지
        return is_i_valid and is_j_valid and is_not_puddle # 도달할 수 있는지 여부를 반환
        
    
    arr[0][0] = 1 # 시작하는 칸에 도달할 수 있는 방법은 한가지
    for x, y in puddles: arr[y-1][x-1] = -1 # 물에 잠긴 칸을 표시
        
    for i in range(n):
        for j in range(m):
            if arr[i][j] != 0: continue # 해당 칸의 값이 0이 아니라면 이미 체크한 곳임
            if check(i, j-1): arr[i][j] += arr[i][j-1] # 현재 위치의 왼쪽 칸이 도달할 수 있는 곳이라면 방법의 수를 업데이트
            if check(i-1, j): arr[i][j] += arr[i-1][j] # 현재 위치의 윗쪽 칸이 도달할 수 있는 곳이라면 방법의 수를 업데이트
    
    return arr[n-1][m-1] % 1000000007 # 최종 위치에 도달할 수 있는 벙법의 수 반환