@Eeap
velog
@Eeap
전체 방문자
오늘
어제
  • 전체 (168)
    • osam (1)
    • Cloud (21)
      • Docker (2)
      • AWS (13)
    • AI & Data (7)
    • Algorithm (76)
      • Baekjoon (75)
      • Codeforces (1)
    • Language (18)
      • Java (18)
    • Back-end (17)
      • Spring (3)
      • JSP & Servlet (12)
      • Go (2)
    • 일상 (4)
    • 기타 (8)
    • git (1)
    • Infra (9)
      • Apache Kafka (5)
      • Kubernetes (4)
      • 기타 (0)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 오블완
  • Python
  • Agent
  • CLASS
  • SageMaker
  • bedrock
  • flink
  • 티스토리챌린지
  • bedrock api
  • sagemaker unified studio
  • AWS CodeArtifact
  • 심폴릭링크
  • AWS CodeStar
  • invokemodel api
  • knowledge bases
  • bedrock agent
  • converse api
  • java
  • AWS CodeCatalyst
  • 인터페이스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
@Eeap

velog

Algorithm/Baekjoon

Python 16928번 뱀과 사다리 게임

2022. 8. 5. 20:14
반응형

 

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

 

16928번: 뱀과 사다리 게임

첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으

www.acmicpc.net

 

문제를 어떻게 풀까 고민하다가 dp랑 bfs를 섞어서 써봤다!

먼저 visited로 dp를 관리했고 bfs로 주사위를 던져서 간 칸의 값을 q에 append해줬다.

하지만 그 칸에 뱀이나 사다리를 타는 칸이 있다면 사다리를 타고 올라간 칸이나 뱀을 타고 내려간 칸을 dp방식을 이용해 주사위를 던진 횟수가 최소가 되는 경우를 해당 칸의 visited에 저장했다.

처음에는 사다리만 타고 올라가면 최소가 되겠지 생각하고 뱀을 타고 내려간 경우를 안해줬는데

생각해보니 뱀을 타고 내려갔다가 사다리를 타고 올라간 경우가 최소가 되는 경우도 있는 것 같다

예를 들어 사다리를 타고 2번째에서 50번째로 가고 뱀을 타고 가서 52에서 35로 가고 사다리를 다시 또 타서 36에서 100으로 갈 수도 있는 경우도 있다.

import sys
from collections import deque

input=sys.stdin.readline
n,m = map(int,input().split())
ladder={}
snake={}
for i in range(n):
    a,b = map(int,input().split())
    ladder[a]=b
for i in range(m):
    a, b = map(int, input().split())
    snake[a] = b

visited=[10000 for _ in range(101)]
visited[1]=0
check=[0 for _ in range(101)]
def bfs(visited,check):
    q = deque([1])
    check[1]=1
    while True:
        if not q:
            break
        num = q.popleft()
        check[num] = 1
        for c in range(6,0,-1):
            if num+c <=100 and not check[num+c]:
                n_num = num+c
                if n_num in ladder:
                    l_num = ladder[n_num]
                    if not check[l_num]:
                        check[l_num]=1
                        visited[l_num]=min(visited[num]+1,visited[l_num])
                        q.append(l_num)
                        # print(num,n_num,l_num)
                    continue
                if n_num in snake:
                    s_num = snake[n_num]
                    if not check[s_num]:
                        check[s_num]=1
                        visited[s_num]=min(visited[num]+1,visited[s_num])
                        q.append(s_num)
                        # print(num, n_num, s_num)
                    continue
                if visited[num]+1 < visited[n_num]:
                    visited[n_num]=min(visited[num]+1,visited[n_num])
                    q.append(n_num)



bfs(visited,check)
print(visited[100])
반응형
저작자표시 (새창열림)

'Algorithm > Baekjoon' 카테고리의 다른 글

Python 16234번 인구 이동  (0) 2022.08.06
Python 16929번 Two Dots  (0) 2022.08.05
Python 11048번 이동하기  (0) 2022.08.03
Python 14225번 부분수열의 합  (0) 2022.08.01
Python 2529번 부등호  (0) 2022.07.31
    'Algorithm/Baekjoon' 카테고리의 다른 글
    • Python 16234번 인구 이동
    • Python 16929번 Two Dots
    • Python 11048번 이동하기
    • Python 14225번 부분수열의 합
    @Eeap
    @Eeap

    티스토리툴바