๐ก๋ฌธ์
๋ฌธ์ ๋งํฌ: https://school.programmers.co.kr/learn/courses/30/lessons/87694
๋ฌธ์ ๋ ์๋์ ๊ฐ์ด ์ฌ๋ฌ๊ฐ์ ์ฌ๊ฐํ ์ ๋ณด(์ขํ๋จ ์ขํ์ ์ฐ์๋จ ์ขํ)๊ฐ ์ฃผ์ด์ก์ ๋ ํ ๋๋ฆฌ๋ฅผ ๋ฐ๋ผ ๋ค๊ฐํ ๋ชจ์ ์งํ์ด ๋ง๋ค์ด์ง๊ณ , ๊ทธ ์์ ์บ๋ฆญํฐ์ ์์น์ ์์ดํ ์ ์์น๊ฐ ์ฃผ์ด์ก์ ๋ ์์ดํ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
๐กํ์ด
๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด์๋ ๋๊ฐ์ง ๊ณผ์ ์ด ํ์ํฉ๋๋ค.
1. ํ
๋๋ฆฌ๋ฅผ ๋ฐ๋ผ ๊ฒ์ ๋งต์ ๋ง๋ค์ด์ผํ๊ณ ,
2. ๊ทธ ํ
๋๋ฆฌ๋ฅผ ๋ฐ๋ผ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ฉด ๋ฉ๋๋ค.
์ ๋ ํ ๋๋ฆฌ๋ฅผ ๋ฐ๋ผ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๊ฒ ์ ํ์ ์ธ BFS ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๊ฒ ํ ์ ์๊ฒ ๋ค๊ณ ์๊ฐํ๋๋ฐ, ์ฒซ๋ฒ์งธ ๊ณผ์ , ์ฆ ํ ๋๋ฆฌ๋ฅผ ๋ง๋๋ ๊ฒ์์ ๊ณ ๋ฏผ์ ๋ง์ด ํ์์ต๋๋ค. ๊ทธ๋์ ์ด๋ฒ ๊ธ์์๋ ์ ๊ฐ ๊ฒช์ ์ํ์ฐฉ์ค ๊ณผ์ ์ ๊ทธ๋๋ก ์์ฑํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ฒซ๋ฒ์งธ๋ก ์ ๊ฐ ์๊ฐํ ๊ฒ์ ๋ฌธ์ ์์ ์ค ๊ทธ๋๋ก "๊ตฌํ"ํ๋ ๊ฒ์ด์์ต๋๋ค. ์ฐ์ ๋ฌธ์ ์์ ๊ฐ๋ก ์ธ๋ก ์ต๋๊ฐ 50์ด๋ผ๊ณ ์ฃผ์์ผ๋ -1๋ก ์ฑ์์ง 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ๋จผ์ ๋ง๋ค์ด๋๊ณ , ๋ฌธ์ ์์ ์ฃผ์ด์ง ์ฌ๊ฐํ ์ ๋ณด๋ฅผ ์์๋๋ก ์ฒ๋ฆฌํ๋ฉด์
ํ
๋๋ฆฌ๋ 1, ๋ด๋ถ๋ 0์ผ๋ก ์ฑ์ ์ต๋๋ค. ์ด๋ ์ฌ๊ฐํ์ ํ
๋๋ฆฌ๊ฐ ๋ค๋ฅธ ์ฌ๊ฐํ์ ๋ด๋ถ์ ๊ฒน์น๋ฉด 0(๋ด๋ถ)๋ก ์ฒ๋ฆฌํ์ฌ ๋ค๊ฐํ์ ๋ง๋ค ์ ์๋๋ก ํ์์ต๋๋ค. ์ด๋ฅผ ๊ตฌํํ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
field = [[-1] * 51 for _ in range(51)]
for rectangle in rectangles:
x1, y1, x2, y2 = rectangle
for i in range(x1, x2 + 1):
for j in range(y1, y2 + 1):
if x1 < i < x2 and y1 < j < y2: # ์ฌ๊ฐํ ๋ด๋ถ
field[i][j] = 0
elif field[i][j] == 0: # ํ
๋๋ฆฌ์ธ๋ฐ, ์ด๋ฏธ ๋ค๋ฅธ ์ฌ๊ฐํ์ ๋ด๋ถ์ธ ๊ฒฝ์ฐ
field[i][j] = 0
else: # ํ
๋๋ฆฌ
field[i][j] = 1
์์ ์ฝ๋๋ฅผ ์คํํ์ฌ ์ ์ถ๋ ฅ์์ 1๋ฒ์ field๋ฅผ printํด๋ณด๋ฉด ์๋์ ๊ฐ์ต๋๋ค. (ํธ์์ ์ ์ฒด ๋งต์ ํฌ๊ธฐ๋ฅผ 20x20์ผ๋ก ์ค์์ต๋๋ค.)
์ด๋ ๊ฒ ๋ฝ์๋๊ณ ๋ณด๋ '์ค ๋ฌธ์ ์์ ํ ๋๋ฆฌ๋ฅผ ๊ทธ๋ฆฐ๊ฒ์ฒ๋ผ ๋๊ฐ์ด ๋์ค๋๊น ์ด์ BFS๋ก ์ต๋จ๊ฑฐ๋ฆฌ ๊ตฌํ๋ฉด๋๊ฒ ๋ค!' ํ๊ณ ๋ฐ๋ก BFS๋ก ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด๋ณด์๋๋ ์๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค. ๋นจ๊ฐ์ ๋ถ๋ถ์ด ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์ ๋๋ค.
ํ๊ด์์ ๋ฐ๋ผ์ ์์ง์ฌ์ผํ๋๋ฐ, BFS์์ ์ํ์ข์ฐ๋ฅผ ๋ชจ๋ ํ์ํ๋ค๋ณด๋ ํ ๋๋ฆฌ๋ก ์ด์ด์ง์ง ์์ง๋ง ์ธ์ ํด์๋ ๋ถ๋ถ์ผ๋ก ๋ฐ๋ก ๋์ด๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์๋ชป ๊ณ์ฐ๋๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋ ๊ฒ์ด์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๋ฌธ์ ๊ฐ ๋๋ ๋ถ๋ถ์ ๋จ์ด๋จ๋ ค๋๋ ๊ฒ์ ๋๋ค.
๋ฐ๋ผ์ ๊ฒ์ ๋งต ํฌ๊ธฐ๋ฅผ 2๋ฐฐ๋ก ๋๋ฆฌ๊ณ ์ฌ๊ฐํ๋ ๋๋ฐฐ๋ก ๋๋ ธ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์๋์ฒ๋ผ ๋ฌธ์ ๊ฐ ๋์๋ ๋ถ๋ถ์ด ๋จ์ด์ง๊ฒ ๋๋ฉด์ ์ ํํ๊ฒ ํ ๋๋ฆฌ๋ง์ ๋ฐ๋ผ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
๐ก์ ๋ต ์ฝ๋
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# programmers ์์ดํ
์ค๊ธฐ
from collections import deque
def solution(rectangles, characterX, characterY, itemX, itemY):
answer = 0
routes = []
field = [[-1] * 102 for _ in range(20)]
for rectangle in rectangles:
x1, y1, x2, y2 = map(lambda x: x * 2, rectangle)
for i in range(x1, x2 + 1):
for j in range(y1, y2 + 1):
if x1 < i < x2 and y1 < j < y2:
field[i][j] = 0
elif field[i][j] == 0:
field[i][j] = 0
else:
field[i][j] = 1
character = (characterX * 2, characterY * 2)
item = (itemX, itemY)
visited = [[False] * 102 for _ in range(102)]
queue = deque([character])
visited[characterX * 2][characterY * 2] = True
dx, dy = [0, 0, -1, 1], [-1, 1, 0, 0]
while queue:
x, y = queue.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if field[nx][ny] == 1 and not visited[nx][ny]:
queue.append((nx, ny))
visited[nx][ny] = True
field[nx][ny] = field[x][y] + 1
return field[itemX * 2][itemY * 2] // 2
rectangles = [[1, 1, 7, 4], [3, 2, 5, 5], [4, 3, 6, 9], [2, 6, 8, 8]]
characterX, characterY, itemX, itemY = 1, 3, 7, 8
print(solution(rectangles, characterX, characterY, itemX, itemY))
- ๊ฐ๋ก์ ์ธ๋ก๊ฐ ๋ชจ๋ ์ต๋ 50์ด๋ฏ๋ก
field
๋ 102x102๋ก ์์ฑํฉ๋๋ค. (51 * 2) - ๋ฌธ์ ์์ ์ฃผ์ด์ง ์ฌ๊ฐํ์ ์ ๋ณด(
rectangle
)๋ฅผ ๋ชจ๋ 2๋ฐฐ๋ก ํ์ฌ field๋ฅผ ๋ง๋ญ๋๋ค. character
์ ์์น๋ ๋ง์ฐฌ๊ฐ์ง๋ก 2๋ฐฐ๋ฅผ ํด์ค๋๋ค.- ๋ฐฉ๋ฌธํ๋์ง ํ์ธํ๋ ๋ฆฌ์คํธ(
visited
)์queue
๋ฅผ ๋ง๋ค์ด์ BFS ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํฉ๋๋ค. field[itemX * 2][itemY * 2]
์ ์ ์ฅ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ 2๋ก ๋๋์ด ์๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฆฌํดํฉ๋๋ค.
๋๊ธ