🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] κ²Œμž„ λ§΅ μ΅œλ‹¨κ±°λ¦¬ (level2, python)

개발자 HOON 2022. 9. 13. 23:04

문제 μ„€λͺ…

ROR κ²Œμž„μ€ 두 νŒ€μœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ μ§„ν–‰ν•˜λ©°, μƒλŒ€ νŒ€ μ§„μ˜μ„ λ¨Όμ € νŒŒκ΄΄ν•˜λ©΄ μ΄κΈ°λŠ” κ²Œμž„μž…λ‹ˆλ‹€. λ”°λΌμ„œ, 각 νŒ€μ€ μƒλŒ€ νŒ€ μ§„μ˜μ— μ΅œλŒ€ν•œ 빨리 λ„μ°©ν•˜λŠ” 것이 μœ λ¦¬ν•©λ‹ˆλ‹€.

 

μ§€κΈˆλΆ€ν„° 당신은 ν•œ νŒ€μ˜ νŒ€μ›μ΄ λ˜μ–΄ κ²Œμž„μ„ μ§„ν–‰ν•˜λ €κ³  ν•©λ‹ˆλ‹€. λ‹€μŒμ€ 5 x 5 크기의 맡에, λ‹Ήμ‹ μ˜ 캐릭터가 (ν–‰: 1, μ—΄: 1) μœ„μΉ˜μ— 있고, μƒλŒ€ νŒ€ μ§„μ˜μ€ (ν–‰: 5, μ—΄: 5) μœ„μΉ˜μ— μžˆλŠ” 경우의 μ˜ˆμ‹œμž…λ‹ˆλ‹€.

 

 

μœ„ κ·Έλ¦Όμ—μ„œ 검은색 뢀뢄은 벽으둜 λ§‰ν˜€μžˆμ–΄ 갈 수 μ—†λŠ” 길이며, 흰색 뢀뢄은 갈 수 μžˆλŠ” κΈΈμž…λ‹ˆλ‹€. 캐릭터가 움직일 λ•ŒλŠ” 동, μ„œ, 남, 뢁 λ°©ν–₯으둜 ν•œ μΉΈμ”© μ΄λ™ν•˜λ©°, κ²Œμž„ 맡을 λ²—μ–΄λ‚œ 길은 갈 수 μ—†μŠ΅λ‹ˆλ‹€.
μ•„λž˜ μ˜ˆμ‹œλŠ” 캐릭터가 μƒλŒ€ νŒ€ μ§„μ˜μœΌλ‘œ κ°€λŠ” 두 κ°€μ§€ 방법을 λ‚˜νƒ€λ‚΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

  • 첫 번째 방법은 11개의 칸을 μ§€λ‚˜μ„œ μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν–ˆμŠ΅λ‹ˆλ‹€.
  • 두 번째 방법은 15개의 칸을 μ§€λ‚˜μ„œ μƒλŒ€νŒ€ μ§„μ˜μ— λ„μ°©ν–ˆμŠ΅λ‹ˆλ‹€.

μœ„ μ˜ˆμ‹œμ—μ„œλŠ” 첫 번째 방법보닀 더 λΉ λ₯΄κ²Œ μƒλŒ€νŒ€ μ§„μ˜μ— λ„μ°©ν•˜λŠ” 방법은 μ—†μœΌλ―€λ‘œ, 이 방법이 μƒλŒ€ νŒ€ μ§„μ˜μœΌλ‘œ κ°€λŠ” κ°€μž₯ λΉ λ₯Έ λ°©λ²•μž…λ‹ˆλ‹€.

 

λ§Œμ•½, μƒλŒ€ νŒ€μ΄ μžμ‹ μ˜ νŒ€ μ§„μ˜ μ£Όμœ„μ— 벽을 μ„Έμ›Œλ‘μ—ˆλ‹€λ©΄ μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν•˜μ§€ λͺ»ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 κ²½μš°μ— λ‹Ήμ‹ μ˜ μΊλ¦­ν„°λŠ” μƒλŒ€ νŒ€ μ§„μ˜μ— 도착할 수 μ—†μŠ΅λ‹ˆλ‹€.

κ²Œμž„ 맡의 μƒνƒœ mapsκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, 캐릭터가 μƒλŒ€ νŒ€ μ§„μ˜μ— λ„μ°©ν•˜κΈ° μœ„ν•΄μ„œ μ§€λ‚˜κ°€μ•Ό ν•˜λŠ” 칸의 개수의 μ΅œμ†Ÿκ°’을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”. 단, μƒλŒ€ νŒ€ μ§„μ˜μ— 도착할 수 없을 λ•ŒλŠ” -1을 return ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

 

  • mapsλŠ” n x m 크기의 κ²Œμž„ 맡의 μƒνƒœκ°€ λ“€μ–΄μžˆλŠ” 2차원 λ°°μ—΄λ‘œ, nκ³Ό m은 각각 1 이상 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
    • nκ³Ό m은 μ„œλ‘œ 같을 μˆ˜λ„, λ‹€λ₯Ό μˆ˜λ„ μžˆμ§€λ§Œ, nκ³Ό m이 λͺ¨λ‘ 1인 κ²½μš°λŠ” μž…λ ₯으둜 μ£Όμ–΄μ§€μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • mapsλŠ” 0κ³Ό 1둜만 이루어져 있으며, 0은 벽이 μžˆλŠ” 자리, 1은 벽이 μ—†λŠ” 자리λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • μ²˜μŒμ— μΊλ¦­ν„°λŠ” κ²Œμž„ 맡의 쒌츑 상단인 (1, 1) μœ„μΉ˜μ— 있으며, μƒλŒ€λ°© μ§„μ˜μ€ κ²Œμž„ 맡의 우츑 ν•˜λ‹¨μΈ (n, m) μœ„μΉ˜μ— μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

μž…μΆœλ ₯ 예 μ„€λͺ…

 

μž…μΆœλ ₯ 예 #1
μ£Όμ–΄μ§„ λ°μ΄ν„°λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

캐릭터가 적 νŒ€μ˜ μ§„μ˜κΉŒμ§€ μ΄λ™ν•˜λŠ” κ°€μž₯ λΉ λ₯Έ 길은 λ‹€μŒ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ 총 11칸을 캐릭터가 μ§€λ‚˜κ°”μœΌλ―€λ‘œ 11을 return ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예 #2
문제의 μ˜ˆμ‹œμ™€ κ°™μœΌλ©°, μƒλŒ€ νŒ€ μ§„μ˜μ— 도달할 방법이 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ -1을 return ν•©λ‹ˆλ‹€.


풀이 μ½”λ“œ

from collections import deque

def bfs(maps):
    cnt = 1
    queue = deque()
    max_x = len(maps)
    max_y = len(maps[0])
    queue.append([max_x-1, max_y-1, cnt])
    maps[max_x-1][max_y-1] = 0
    
    dx = [-1, 0, 1, 0]
    dy = [0, -1, 0, 1]
    
    while queue:
        x, y, cnt = queue.popleft()
        
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx == 0 and ny == 0:
                return cnt + 1
            if 0 <= nx < max_x and 0 <= ny < max_y:
                if maps[nx][ny] != 0:
                    maps[nx][ny] = 0
                    queue.append([nx, ny, cnt+1])

    return -1

def solution(maps):
    answer = bfs(maps)
    return answer

BFS둜 ν’€μ΄ν–ˆλ‹€.

νš¨μœ¨μ„± ν†΅κ³Όμ—μ„œ μ• λ₯Ό λ¨Ήμ—ˆλŠ”λ°, 이 κ³Όμ •μ—μ„œ μƒˆλ‘œμš΄ 지식을 μ–»μ—ˆλ‹€!

λ°±μ€€ ν”Œλ ˆν‹°λ„˜μ„ μ°μ—ˆμ—ˆμ§€λ§Œ, 였늘 BFS κ΄€λ ¨ 처음 μ•Œμ•„λ‚Έ 사싀이 μžˆλŠ” 것에 아직도 λ©€μ—ˆλ‹€λŠ” 생각이 λ“ λ‹€.

 

νš¨μœ¨μ„±μ„ ν†΅κ³Όν•˜κ²Œ ν•΄μ€€ ν‚€λŠ”,

λ°©λ¬Έ μ—¬λΆ€λ₯Ό νμ—μ„œ κΊΌλ‚Έ λ‹€μŒ 체크λ₯Ό ν• κΉŒ vs λ°©λ¬Έ μ—¬λΆ€λ₯Ό 큐에 μ§‘μ–΄ λ„£μœΌλ©΄μ„œ 체크λ₯Ό ν• κΉŒμ˜ λ…ΌμŸμ΄λ‹€.

 

ν•„μžμ˜ κΈ°μ‘΄ μ½”λ”© μŠ€νƒ€μΌμ€ λ°©λ¬Έ μ—¬λΆ€λ₯Ό νμ—μ„œ κΊΌλ‚Έ λ‹€μŒ 체크λ₯Ό ν•΄μ€¬λŠ”λ°, 이 점이 νš¨μœ¨μ„±μ„ ν†΅κ³Όν•˜μ§€ λͺ»ν•˜κ²Œ λ§Œλ“€μ—ˆλ‹€.

νš¨μœ¨μ„±λ©΄μ—μ„œ λ’€μ³μ§€λŠ” μ΄μœ λŠ”, κΊΌλ‚Ό λ•Œ λ°©λ¬Έ 처리λ₯Ό ν•˜λ©΄, 이미 큐 내뢀에 λ“€μ–΄κ°„ λΈ”λŸ­μ„ 또 넣을 수 있기 λ•Œλ¬Έμ΄λ‹€.

이 그림을 보자. 10(1)κ³Ό 10(2)λ₯Ό μ§‘μ€‘μ μœΌλ‘œ ν™•μΈν•΄λ³΄μž.

큐 내뢀에 [10(1), 10(2)]κ°€ μžˆλ‹€.

10(1)이 λΉ μ Έλ‚˜μ˜€κ³ , 10(1)에 λŒ€ν•΄ λ°©λ¬Έ 체크λ₯Ό ν•˜κ³ , 11λ₯Ό 큐에 λ„£λŠ”λ‹€.

κ·Έ λ‹€μŒ 10(2)κ°€ λΉ μ Έλ‚˜μ˜€κ³ , 10(2)에 λŒ€ν•΄ λ°©λ¬Έ 체크λ₯Ό ν•˜κ³ , 11을 λ‹€μ‹œ 큐에 또 λ„£λŠ”λ‹€!

μ΄λ ‡κ²Œ μ€‘λ³΅λœ λΈ”λŸ­μ΄ 큐에 μΆ”κ°€λ‘œ λ“€μ–΄κ°„λ‹€λŠ” μ μ—μ„œ μ‹œκ°„ λ³΅μž‘λ„ μΈ‘λ©΄μ—μ„œ λΆˆλ¦¬ν•˜λ‹€.

 

λ°©λ¬Έ μ—¬λΆ€λ₯Ό 큐에 μ§‘μ–΄ λ„£μœΌλ©΄μ„œ 체크λ₯Ό ν•˜λŠ” 것이 BFS κ΅¬ν˜„ν•  λ•Œ 속도 μΈ‘λ©΄μ—μ„œ μœ λ¦¬ν•  수 μžˆλ‹€!!

μ‹œκ°„ λ³΅μž‘λ„ 고쳐보겠닀고 기쑴에 μƒˆλ‘œ μƒμ„±ν•œ visited 배열도 μ—†μ• κ³ , μ΅œμ ν™”λœ λ°©ν–₯도 λ§Œλ“€μ–΄λ³΄κ³ , (n, m)μœ„μΉ˜μ—μ„œλ„ μ‹œμž‘ν•΄λ΄€λŠ”λ° λͺ¨λ‘ μ‹€νŒ¨ν–ˆλ‹€ γ…Žγ…Ž.. κ·Έλž˜λ„ 이런 μ‹œλ„ 덕에 μƒˆλ‘œμš΄ 사싀을 μ•Œμ•„μ„œ λΏŒλ“―ν•˜λ‹€!