[LeetCode/BFS] 909. Snakes and Ladders (medium, python)

2024. 1. 31. 14:18· Coding Test/Python
목차
  1. 아이디어
  2. 새 보드판 생성
  3. 이동 구현
  4. 전체 코드

https://leetcode.com/problems/snakes-and-ladders/description/?envType=study-plan-v2&envId=top-interview-150

 

LeetCode - The World's Leading Online Programming Learning Platform

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

아이디어

BFS로 가장 짧은 이동 시간을 구하면 됐다.

2차원 리스트 보드판을 1차원으로 바꿔서 풀었다.

새 보드판 생성

주어진 board는 아래와 같은 형식이다

16 15 14 13
9 10 11 12
8 7 6 5
1 2 3 4

이러면 bfs에서 이동을 처리할때 복잡할 것 같아서 아래와 같은 일차원 리스트로 바꿨다. (이동하는 방향이 정해져있어서 가능하다.)

1 2 3 4 5 6 7 8 9 ...
    N = len(board)

    b = []
    for i in range(N - 1, -1, -1):
        if N % 2 == 0:
            if i % 2 == 0: b += board[i][::-1]
            else: b += board[i]
        else:
            if i % 2 == 1: b += board[i][::-1]
            else: b += board[i]

N*N 보드판에서 N의 크기가 짝수일 때와 홀수일 때 도착하는 곳이 다르기 때문에 나누어서 구해주었다.

 

이동 구현

    visited = [0] * (N * N)
    queue = deque([(0, 0)])
    while queue:
        print(queue)
        x, m = queue.popleft()
        
        if x == (N * N - 1):
            return m
        
        for i in range(1, 7):
            nx = x + i
            if nx < 0 or nx >= N * N or visited[nx] == 1: continue
            visited[nx] = 1

            if b[nx] > -1:
                queue.append((b[nx] - 1, m + 1)) 
            else:
                queue.append((nx, m + 1))

    return -1

문제 조건 중에 연달아서 뱀이나 사다리로 이동하지는 못한다는 것이 있다. 

그래서 뱀이나 사다리로 이동해서 도달한 위치의 visited는 변경하지 않고, 이동한 곳에서 무조건 1칸은 움직이게 구현하였다.

전체 코드

class Solution:
    def snakesAndLadders(self, board: List[List[int]]) -> int:
        N = len(board)

        b = []
        for i in range(N - 1, -1, -1):
            if N % 2 == 0:
                if i % 2 == 0: b += board[i][::-1]
                else: b += board[i]
            else:
                if i % 2 == 1: b += board[i][::-1]
                else: b += board[i]

        visited = [0] * (N * N)
        
        queue = deque([(0, 0)])
        while queue:
            x, m = queue.popleft()
            if x == (N * N - 1):
                return m
            
            for i in range(1, 7):
                nx = x + i
                if nx < 0 or nx >= N * N or visited[nx] == 1: continue
                visited[nx] = 1

                if b[nx] > -1:
                    queue.append((b[nx] - 1, m + 1)) 
                else:
                    queue.append((nx, m + 1))

        return -1

'Coding Test > Python' 카테고리의 다른 글

[백준/DP] 11057번: 오르막 수 (실버1, python)  (1) 2024.02.01
[백준/DP] 2293번 동전1 (골드5, python)  (1) 2024.02.01
[백준/DP] 1932번: 정수 삼각형 (실버 1, python)  (0) 2024.01.30
[백준/DFS&BFS] 1260번: DFS와 BFS (실버2, python)  (0) 2024.01.29
[백준/DP] 1149번: RGB거리 (실버1, python)  (0) 2024.01.29
  1. 아이디어
  2. 새 보드판 생성
  3. 이동 구현
  4. 전체 코드
'Coding Test/Python' 카테고리의 다른 글
  • [백준/DP] 11057번: 오르막 수 (실버1, python)
  • [백준/DP] 2293번 동전1 (골드5, python)
  • [백준/DP] 1932번: 정수 삼각형 (실버 1, python)
  • [백준/DFS&BFS] 1260번: DFS와 BFS (실버2, python)
lim.dev
lim.dev
* 깃허브: https://github.com/Ellie010707
코딩림* 깃허브: https://github.com/Ellie010707
lim.dev
코딩림
lim.dev
전체
오늘
어제
  • 분류 전체보기 (205)
    • Network (6)
    • Backend (31)
      • Django (8)
      • Spring Boot (22)
    • Frontend (3)
    • Coding Test (107)
      • Python (93)
      • Java (1)
      • C_C#_C++ (4)
      • SQL (8)
    • Security (40)
      • 해커스쿨_FTZ (19)
      • VM (6)
      • CodeEngn (11)
      • Linux (4)
    • Project (2)
    • etc (12)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • ftz
  • stolenbyte
  • 리눅스마스터
  • 해커스쿨ftz
  • ftz writeup
  • ftz풀이
  • ftz 풀이
  • 해킹
  • 코드엔진
  • 리버싱
  • abex
  • ftz write up
  • 리눅스
  • 리버서
  • hacking
  • 해커스쿨
  • crackme
  • reversing
  • CodeEngn
  • linux

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
lim.dev
[LeetCode/BFS] 909. Snakes and Ladders (medium, python)
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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