프로그래머스 - 등굣길

Computer Science/Problem Solving

문제 설명

제한사항 및 입출력

풀이

정말 정석적인 DP 문제이다. 추가적으로 가지 못하는 타일만 고려해주면 된다.

 

dp[i][j] = [0, 0]에서 [i, j]까지 도달할 수 있는 방법의 수

내 코드

MOD = 10**9 + 7

def solution(m, n, puddles):
    dp = [[0] * m for _ in range(n)]
    for x, y in puddles:
        dp[y-1][x-1] = -1
        
    for i in range(m):
        if dp[0][i] == -1: break
        dp[0][i] = 1
    for i in range(n):
        if dp[i][0] == -1: break
        dp[i][0] = 1
    
    for i in range(1, n):
        for j in range(1, m):
            if dp[i][j] == -1: continue
            
            dp[i][j] = max(dp[i-1][j], 0) + max(dp[i][j-1], 0)
    
    return dp[-1][-1] % MOD

 

먼저 첫 번째 행과 열을 1로 초기화해주면서 중간에 가지 못하는 타일을 만나면 중단해주었다.

가지 못하는 타일을 -1로 초기화해주었기 때문에 이후 0과 비교해주면서 상태전이해주었다.

 

시간 복잡도: O(n*m) - 모든 격자 탐색

고찰

1차원 dp로 압축할 수 있다. 배낭문제도 그렇고 dp 문제들은 차원을 줄이면서 최적화하는게 재밌는 것 같다. 시간 복잡도는 동일하지만 공간 복잡도가 줄었다.

 

dp 테이블 정의는 다음과 같다.

dp[x] = 현재 y행에서 [x, y]까지 오는 경우의 수

 

이중 for문에서 바깥쪽 반복문은 위에서 아래로 한 줄씩 내려오는 반복이다. [x, y]를 처리할 때 dp[x]에는 위 칸까지의 경로 수가 저장되어있고, dp[x-1]에는 왼쪽 칸까지의 경로 수가 저장되어 있다.

MOD = 10**9 + 7

def solution(m, n, puddles):
    blocked = {(x - 1, y - 1) for x, y in puddles}

    dp = [0] * m
    dp[0] = 1

    for y in range(n):
        for x in range(m):
            if (x, y) in blocked:
                dp[x] = 0
            elif x > 0:
                dp[x] = (dp[x] + dp[x - 1]) % MOD
            # x == 0이면 위에서 내려오는 값(dp[0])만 유지

    return dp[-1] % MOD

 

'Computer Science > Problem Solving' 카테고리의 다른 글

프로그래머스 - 메뉴 리뉴얼  (0) 2025.11.16
프로그래머스 - 서버 증설 횟수  (0) 2025.11.15
프로그래머스 - k진수에서 소수 개수 구하기  (0) 2025.11.05
프로그래머스 - n^2 배열 자르기  (0) 2025.11.04
프로그래머스 - 네트워크  (0) 2025.11.03
'Computer Science/Problem Solving' 카테고리의 다른 글
  • 프로그래머스 - 메뉴 리뉴얼
  • 프로그래머스 - 서버 증설 횟수
  • 프로그래머스 - k진수에서 소수 개수 구하기
  • 프로그래머스 - n^2 배열 자르기
hojoo
hojoo
그냥 개발이 즐거운 사람
  • hojoo
    dev_record
    hojoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (84)
      • Study (0)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (0)
        • Real MySQL 8.0 (0)
        • 친절한 SQL 튜닝 (0)
        • 도메인 주도 개발 시작하기 (0)
        • 대규모 시스템 설계 기초 (0)
      • Computer Science (68)
        • Problem Solving (30)
        • Data Structure (4)
        • Spring Boot (14)
        • DB (1)
        • Java (4)
        • OS (3)
        • Server (3)
        • Tech (0)
      • Security (16)
        • Reversing (15)
        • Assembly (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    19622
    DB
    레나 튜토리얼
    dreamhack.io
    16946
    Header
    서버 증설 횟수
    리버싱
    servlet
    13265
    bean
    DP
    n+1
    HTTP
    리버싱 핵심원리
    n^2 배열 자르기
    자료구조
    프로그래머스
    Spring boot
    Reversing
    x64dbg
    9421
    백준
    12033
    소수상근수
    21278
    2539
    Lena tutorial
    15973
    PE header
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
hojoo
프로그래머스 - 등굣길
상단으로

티스토리툴바