πŸ“’  문제 정보

 

 

πŸ”’  문제 μ„€λͺ…

더보기

문제 μ„€λͺ…

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) μœ„μΉ˜μ— μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

maps answer
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1

 

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

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

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

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

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

 

 

πŸ”‘  문제 풀이

풀이. BFS ν™œμš©

BFSλ₯Ό ν™œμš©ν•œ 풀이이닀. 

from collections import deque

def solution(maps):
    x, y = 0, 0
    n, m = len(maps), len(maps[0])

    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]

    queue = deque()
    queue.append((x, y))

    while queue:
        x, y = queue.popleft()
        for di in range(4):
            nx = x + dx[di]
            ny = y + dy[di]
            if nx < n and ny < m and nx >= 0 and ny >= 0:
                if maps[nx][ny] != 0:
                    if maps[nx][ny] == 1:
                        maps[nx][ny] = maps[x][y] + 1
                        queue.append((nx, ny))

    if maps[n-1][m-1] in [0, 1]:
    	return -1
    else:
    	return maps[n-1][m-1]

 

 

πŸ’‘  What I learned

 

이번 κΈ°νšŒμ— dfs, bfs λ‚΄μš©μ„ 정리할 수 μžˆμ—ˆλ‹€. 특히, μ΄μ œλŠ” μ™œ λ‚˜λŠ” 'dfs μ›νˆ΄'이닀 / 'bfs μ›νˆ΄'이닀 라고듀 이야기 ν•˜λŠ”μ§€ κΉ¨λ‹¬μ•˜λ‹€. λ‹€λ§Œ 각 μ•Œκ³ λ¦¬μ¦˜μ— λ”μš± 효율적인 μ•Œκ³ λ¦¬μ¦˜μ€ μžˆμœΌλ‹ˆ λ‘˜ λ‹€ 자유자재둜 μ‚¬μš©ν•  쀄 μ•„λŠ” 것이 μ’‹κ² λ‹€.

문제λ₯Ό λ”± 보면 이것이 DFS인지 BFS인지 λ”± μ•Œμ•„λ³΄λŠ” μ•ˆλͺ©μ΄ 생길 λ•ŒκΉŒμ§€ ν›ˆλ ¨μ΄ ν•„μˆ˜μ μ΄κ² λ‹€.

BELATED ARTICLES

more