[백준] 1890번 점프 (파이썬/Python) - DP

2022. 12. 9. 16:02·Algorithm (PS)
728x90

https://www.acmicpc.net/problem/1890

 

1890번: 점프

첫째 줄에 게임 판의 크기 N (4 ≤ N ≤ 100)이 주어진다. 그 다음 N개 줄에는 각 칸에 적혀져 있는 수가 N개씩 주어진다. 칸에 적혀있는 수는 0보다 크거나 같고, 9보다 작거나 같은 정수이며, 가장

www.acmicpc.net

최근 계속 밤새서 팀플하고 사랑니뽑고 아팠다가 다시 회복하고 백준 달린다 ㅎㅎ ..

n = int(input())
array = []
answer = 0
for _ in range(n):
    array.append(list(map(int, input().split())))

# 오른쪽, 아래
dx = [0, 1]
dy = [1, 0]

visited = [[False] * n for _ in range(n)]
def dfs(x, y):
    global answer
    if x == n-1 and y == n-1:
        answer += 1
        return
    for i in range(2):
        # 반드시 array[x][y] 칸 만큼 이동
        nx = x + dx[i]*array[x][y]
        ny = y + dy[i]*array[x][y]

        if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny]:
            visited[nx][ny] = True
            dfs(nx, ny)
            visited[nx][ny] = False


visited[0][0] = True # start point
dfs(0, 0)
print(answer)

dfs로 백트래킹하면 시간초과가 난다  그럴줄 알았지만..역시 ㅎ

라고 문제에서 써놓은 이유가 있겠지 ? 2**63-1 을 계산하면 .. 9223372036854775807 라는 숫자가 찍한다 
dfs 재귀호출하면 당연히 시간초과/메모리초과가 날 수 밖에 없는 구조이다 

이를 해결하기 위해 DP로 푸는 방법이 있다. 
생각해보면 간단한 것이 이동방법이 2가지 밖에 없다. 

n = int(input())
array = []

for _ in range(n):
    array.append(list(map(int, input().split())))


# dp 에 array(i,j) 를 지나는 경우의 수(경로) 를 저장한다.
dp = [[0]*n for _ in range(n)]
dp[0][0] = 1

for x in range(n):
    for y in range(n):
        if x == n-1 and y == n-1: # 여기서 멈춰야 구하고 싶은 값 출력 가능 
            print(dp[-1][-1])
            break
        # 오른쪽  (0, 1) 증가
        if y + array[x][y] < n: # 이동 가능 범위인지 확인
            dp[x][y + array[x][y]] += dp[x][y]

        # 아래로 이동
        if x + array[x][y] < n:
            dp[x+array[x][y]][y] += dp[x][y]

1) dp 는 n*n 의 2차원 배열으로 생성해 준다. 앞으로의 연산을 위해 dp[0][0] 을 1로 초기화한다. 

2) 오른쪽으로 이동하는 경우 / 아래쪽으로 이동하는 경우를 확인한다 
문제에서 그래도 친절하게 x 값을 바꾸는 경우, y 값을 바꾸는 경우 2가지로 제한했다는 생각이 든다.. 

먼저 오른쪽으로 이동하는 경우 y 좌표의 값이 증가해야 하고, 범위 내에 있어야 한다. 

if y + array[x][y] < n: # 이동 가능 범위인지 확인

조건을 만족하면, 이동할 좌표에 해당하는 공간을 dp 2차원 리스트에서 접근한다. 
이동경로는 이전 위치인(x,y)에서부터 쭉 한가지 경로가 되는 것이므로 dp[x][y] 에 있던 값을 그대로 가져와서 더해준다. 

dp[x][y + array[x][y]] += dp[x][y]



또한 아래쪽으로 이동하는 경우 x 좌표의 값이 증가해야 하고, 범위 내에 있어야 한다. 오른쪽으로 이동하는 경우와 마찬가지로 연산한다. 

# 아래로 이동
if x + array[x][y] < n:
    dp[x+array[x][y]][y] += dp[x][y]
728x90

'Algorithm (PS)' 카테고리의 다른 글

[백준] 20164번 : 홀수 홀릭 호석 (파이썬/Python) - 구현, 브루트포스  (0) 2022.12.09
[백준] 1253번 : 좋다 (파이썬/Python)  (0) 2022.12.09
[백준] 18430 무기공학 파이썬/Python  (0) 2022.12.03
[백준] 6443 애너그램 (Python 파이썬 풀이)  (0) 2022.12.02
[백준] 1474 밑줄 Python 풀이 (Greedy)  (0) 2022.11.28
'Algorithm (PS)' 카테고리의 다른 글
  • [백준] 20164번 : 홀수 홀릭 호석 (파이썬/Python) - 구현, 브루트포스
  • [백준] 1253번 : 좋다 (파이썬/Python)
  • [백준] 18430 무기공학 파이썬/Python
  • [백준] 6443 애너그램 (Python 파이썬 풀이)
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613) N
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30) N
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5) N
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • EC2
  • Databricks
  • 파이썬
  • 빅데이터
  • 데이터엔지니어
  • 코딩테스트
  • SPARK
  • AWS
  • dfs
  • linux
  • 프로그래머스
  • ansible
  • 운영체제
  • python
  • 백트래킹
  • docker
  • 쿠버네티스
  • 알고리즘
  • Swift
  • Leetcode
  • BFS
  • 스파크
  • 데이터브릭스
  • Kubernetes
  • 클라우드
  • 리눅스
  • 백준
  • dp
  • 카카오코딩테스트
  • 데이터엔지니어링

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[백준] 1890번 점프 (파이썬/Python) - DP
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.