๐ค๋ฌธ์ ํด๊ฒฐ
1. Lv3 | BFS ์ฌํ
2. BFS๋ฅผ ๋๋ฆด q์ ๋ฐฉ๋ฌธ์ฒดํฌํ visited๋ฆฌ์คํธ๋ฅผ ์ค๋นํ๋ค.
(1) q๋ deque๋ฅผ ์ด์ฉ. ๋ก๋ด์ ์ขํ 4๊ฐ์ง (x1,y1,x2,y2)์ ํ์ฌ์ ๊ฑฐ๋ฆฌ d ๋ฅผ ๋ฃ๋๋ค.
(2) visited์๋ ๋ก๋ด์ ์ขํ๋ง ๋ฃ๋๋ค.
3. BFS๋ฅผ ๋๋ฆฐ๋ค.
(1) ๋จผ์ ๋์ ์ ๋๋ฌํ๋ค๋ฉด ๋ฐ๋ก ๋ฉ์ถฐ์ฃผ๊ณ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค.
(2) ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ก๋ด์ด ์ธ๋ก์ธ๊ฒฝ์ฐ์ ๊ฐ๋ก์ธ๊ฒฝ์ฐ๋ฅผ ๋๋๊ณ , ์ํ์ข์ฐ ์์ง์ผ ์ ์๋ ์ง ์ฒดํฌํ๋ค.
(3) ๋ก๋ด์ด ์ธ๋ก์ธ ๊ฒฝ์ฐ ์ค๋ฅธ์ชฝ ์ด๋์ด ๊ฐ๋ฅํ๋ฉด ์ค๋ฅธ์ชฝ ํ์ ๋ ๊ฐ๋ฅํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์ผ์ชฝ์ด๋์ด ๊ฐ๋ฅํ๋ฉด ์ผ์ชฝ์ผ๋ก ํ์ ๋ ๊ฐ๋ฅํ๋ค.
(4) ๊ฐ๋ก๋ ๋ง์ฐฌ๊ฐ์ง
(5) ์ด๋์ด๋ ํ์ ์ด ๊ฐ๋ฅํ๋ฉด visited๋ฆฌ์คํธ๋ฅผ ํ์ธํด ๋ฐฉ๋ฌธํ์ ์ด ์์ผ๋ฉด q์ visited์ ๋ฃ์ด์ค๋ค.
(6) (1)๋ฒ์ ๋ง๋๋ฉด ๋
๐จ BFS ์ฌํ ๊ณผ์ ์ธ๋ฏ ํ๋ค.... ๋์นธ์ ์ฐจ์งํ๋ ๊ฐ๋ ๊ณผ ํ์ ๊ฐ๋ ์ด ์ถ๊ฐ๋ผ์ ๋ณต์กํ๋ค.
๋ก๋ด์ ์์น๋ ์๋ค๋ฅผ ๊ตฌ๋ถํด์ค์ผ ํ๋ค. ์ขํ๊ฐ ์์์ชฝ์ด x1,x2๊ฐ ๋์ด์ผ ํ๋ค. ์๊ทธ๋ฌ๋ฉด ๋๋ฌด ๊ฒฝ์ฐ์ ์๊ฐ ๋ง์์ง
๋ญ๊ฐ ๋ก๋ด์ ์ด๋๊ท์น์ด ์์ ๊ฑฐ ๊ฐ์ง๋ง ์ด๋ ๊ฒ ๋ณต์กํ ๋๋ ๊ทธ๋ฅ ํ๊ฐ์ง ํ๊ฐ์ง ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ฅผ ๋ค ๋์ดํ๋๊ฒ ์ข๋ค.
๐ป์์ค ์ฝ๋
from collections import deque
def solution(board):
def my_append(t, d):
# ๋ฐฉ๋ฌธํ์ ์ด ์์ ๋ ์ถ๊ฐํด์ค
if t not in visited:
q.append((t, d))
visited.add(t)
n = len(board)
q = deque()
visited = set() # set์ผ๋ก ๋ง๋ค์ด์ผ ์๊ฐ๋ณต์ก๋ ์ค์ธ๋ค
q.append(((0, 0, 0, 1), 0))
visited.add((0, 0, 0, 1))
while q:
t, d = q.popleft() # t: ํด๋น ์ขํ, d: ๊ฑฐ๋ฆฌ
x1, y1, x2, y2 = t
# ๊ฐ๋ก ๋์ฐฉ
if x1 == n - 1 and x2 == n - 1 and y1 == n - 2 and y2 == n - 1:
return d
# ์ธ๋ก ๋์ฐฉ
if x1 == n - 2 and x2 == n - 1 and y1 == n - 1 and y2 == n - 1:
return d
d += 1 # ๋์ ๋์ฐฉํ์ง ์์์ผ๋ฏ๋ก ๊ฑฐ๋ฆฌ๋ฅผ 1 ๋๋ฆผ
# ์์ง์ด๋ ๋ชจ๋ ์กฐ๊ฑด
# ๊ฐ๋ก ์ผ ๋
if x1 == x2:
# ์ค๋ฅธ์ชฝ ์ด๋
if y2 + 1 < n and board[x2][y2 + 1] == 0:
t = (x1, y1 + 1, x2, y2 + 1)
my_append(t, d)
# ์ผ์ชฝ ์ด๋
if y1 - 1 >= 0 and board[x1][y1 - 1] == 0:
t = (x1, y1 - 1, x2, y2 - 1)
my_append(t, d)
# ์๋ก ์ด๋ | ๊ฐ๋ฅํ๋ฉด ์ค๋ฅธ์ชฝ ์ ํ์ ๋ ๊ฐ๋ฅ, ํ์ชฝ ์ ํ์ ๋ ๊ฐ๋ฅ
if x1 - 1 >= 0 and board[x1 - 1][y1] == 0 and board[x2 - 1][y2] == 0:
t = (x1 - 1, y1, x2 - 1, y2)
my_append(t, d)
# ์ค๋ฅธ์ชฝ ์ ํ์
t = (x1 - 1, y1 + 1, x2, y2)
my_append(t, d)
# ์ผ์ชฝ ์ ํ์
t = (x2 - 1, y2 - 1, x1, y1)
my_append(t, d)
# ์๋๋ก ์ด๋ | ๊ฐ๋ฅํ๋ฉด ์ค๋ฅธ์ชฝ ์๋ ํ์ ๋ ๊ฐ๋ฅ, ์ผ์ชฝ ์๋ ํ์ ๋ ๊ฐ๋ฅ
if x1 + 1 < n and board[x1 + 1][y1] == 0 and board[x2 + 1][y2] == 0:
t = (x1 + 1, y1, x2 + 1, y2)
my_append(t, d)
# ์ค๋ฅธ์ชฝ ์๋ ํ์
t = (x2, y2, x1 + 1, y1 + 1)
my_append(t, d)
# ์ผ์ชฝ ์๋ ํ์
t = (x1, y1, x2 + 1, y2 - 1)
my_append(t, d)
# ์ธ๋ก ์ผ ๋
elif y1 == y2:
# ์ค๋ฅธ์ชฝ ์ด๋
if y1 + 1 < n and board[x1][y1 + 1] == 0 and board[x2][y2 + 1] == 0:
t = (x1, y1 + 1, x2, y2 + 1)
my_append(t, d)
# ์ค๋ฅธ์ชฝ ์๋ ํ์
t = (x2, y2, x1 + 1, y1 + 1)
my_append(t, d)
# ์ค๋ฅธ์ชฝ ์ ํ์
t = (x1, y1, x2 - 1, y2 + 1)
my_append(t, d)
# ์ผ์ชฝ ์ด๋
if y1 - 1 >= 0 and board[x1][y1 - 1] == 0 and board[x2][y2 - 1] == 0:
t = (x1, y1 - 1, x2, y2 - 1)
my_append(t, d)
# ์ผ์ชฝ ์๋ ํ์
t = (x1 + 1, y1 - 1, x2, y2)
my_append(t, d)
# ์ผ์ชฝ ์ ํ์
t = (x2 - 1, y2 - 1, x1, y1)
my_append(t, d)
# ์๋ก ์ด๋
if x1 - 1 >= 0 and board[x1 - 1][y1] == 0:
t = (x1 - 1, y1, x2 - 1, y2)
my_append(t, d)
# ์๋๋ก ์ด๋
if x2 + 1 < n and board[x2 + 1][y1] == 0:
t = (x1 + 1, y1, x2 + 1, y2)
my_append(t, d)
# print(solution([[0, 0, 0, 1, 1], [0, 0, 0, 1, 0], [0, 1, 0, 1, 1], [1, 1, 0, 0, 1], [0, 0, 0, 0, 0]]))
# print(solution([[0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 1, 1, 0], [0, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 1, 1], [0, 0, 1, 0, 0, 0, 0]]))
# print(solution([[0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 1, 0, 0], [0, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0]]))
# print(solution( [[0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 1, 1, 1, 1, 0, 0], [0, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 1, 1, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 0]]))
# 7, 21, 11, 33
๐๋ฌธ์ ํ์ธ
์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค
๋งํฌ: https://programmers.co.kr/learn/courses/30/lessons/60063
๋ฌธ์ ์ค๋ช
๋ก๋ด๊ฐ๋ฐ์ ๋ฌด์ง๋ ํ ๋ฌ ์์ผ๋ก ๋ค๊ฐ์จ ์นด์นด์ค๋ฐฐ ๋ก๋ด๊ฒฝ์ง๋ํ์ ์ถํํ ๋ก๋ด์ ์ค๋นํ๊ณ ์์ต๋๋ค. ์ค๋น ์ค์ธ ๋ก๋ด์ 2 x 1 ํฌ๊ธฐ์ ๋ก๋ด์ผ๋ก ๋ฌด์ง๋ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง N x N ํฌ๊ธฐ์ ์ง๋์์ 2 x 1 ํฌ๊ธฐ์ธ ๋ก๋ด์ ์์ง์ฌ (N, N) ์์น๊น์ง ์ด๋ ํ ์ ์๋๋ก ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ค๊ณ ํฉ๋๋ค. ๋ก๋ด์ด ์ด๋ํ๋ ์ง๋๋ ๊ฐ์ฅ ์ผ์ชฝ, ์๋จ์ ์ขํ๋ฅผ (1, 1)๋ก ํ๋ฉฐ ์ง๋ ๋ด์ ํ์๋ ์ซ์ 0์ ๋น์นธ์ 1์ ๋ฒฝ์ ๋ํ๋ ๋๋ค. ๋ก๋ด์ ๋ฒฝ์ด ์๋ ์นธ ๋๋ ์ง๋ ๋ฐ์ผ๋ก๋ ์ด๋ํ ์ ์์ต๋๋ค. ๋ก๋ด์ ์ฒ์์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ขํ (1, 1) ์์น์์ ๊ฐ๋ก๋ฐฉํฅ์ผ๋ก ๋์ฌ์๋ ์ํ๋ก ์์ํ๋ฉฐ, ์๋ค ๊ตฌ๋ถ์์ด ์์ง์ผ ์ ์์ต๋๋ค.
๋ก๋ด์ด ์์ง์ผ ๋๋ ํ์ฌ ๋์ฌ์๋ ์ํ๋ฅผ ์ ์งํ๋ฉด์ ์ด๋ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ๊ทธ๋ฆผ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ด๋ํ๋ค๋ฉด (1, 2), (1, 3) ๋ ์นธ์ ์ฐจ์งํ๊ฒ ๋๋ฉฐ, ์๋๋ก ์ด๋ํ๋ค๋ฉด (2, 1), (2, 2) ๋ ์นธ์ ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค. ๋ก๋ด์ด ์ฐจ์งํ๋ ๋ ์นธ ์ค ์ด๋ ํ ์นธ์ด๋ผ๋ (N, N) ์์น์ ๋์ฐฉํ๋ฉด ๋ฉ๋๋ค.
๋ก๋ด์ ๋ค์๊ณผ ๊ฐ์ด ์กฐ๊ฑด์ ๋ฐ๋ผ ํ์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ก๋ด์ 90๋์ฉ ํ์ ํ ์ ์์ต๋๋ค. ๋จ, ๋ก๋ด์ด ์ฐจ์งํ๋ ๋ ์นธ ์ค, ์ด๋ ์นธ์ด๋ ์ถ์ด ๋ ์ ์์ง๋ง, ํ์ ํ๋ ๋ฐฉํฅ(์ถ์ด ๋๋ ์นธ์ผ๋ก๋ถํฐ ๋๊ฐ์ ๋ฐฉํฅ์ ์๋ ์นธ)์๋ ๋ฒฝ์ด ์์ด์ผ ํฉ๋๋ค. ๋ก๋ด์ด ํ ์นธ ์ด๋ํ๊ฑฐ๋ 90๋ ํ์ ํ๋ ๋ฐ๋ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ ํํ 1์ด ์ ๋๋ค.
0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ์ง๋์ธ board๊ฐ ์ฃผ์ด์ง ๋, ๋ก๋ด์ด (N, N) ์์น๊น์ง ์ด๋ํ๋๋ฐ ํ์ํ ์ต์ ์๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- board์ ํ ๋ณ์ ๊ธธ์ด๋ 5 ์ด์ 100 ์ดํ์ ๋๋ค.
- board์ ์์๋ 0 ๋๋ 1์ ๋๋ค.
- ๋ก๋ด์ด ์ฒ์์ ๋์ฌ ์๋ ์นธ (1, 1), (1, 2)๋ ํญ์ 0์ผ๋ก ์ฃผ์ด์ง๋๋ค.
- ๋ก๋ด์ด ํญ์ ๋ชฉ์ ์ง์ ๋์ฐฉํ ์ ์๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋๋ค.
์ ์ถ๋ ฅ ์
boardresult
[[0, 0, 0, 1, 1],[0, 0, 0, 1, 0],[0, 1, 0, 1, 1],[1, 1, 0, 0, 1],[0, 0, 0, 0, 0]] | 7 |
์ ์ถ๋ ฅ ์์ ๋ํ ์ค๋ช
๋ฌธ์ ์ ์ฃผ์ด์ง ์์์ ๊ฐ์ต๋๋ค.
๋ก๋ด์ด ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ด๋ ํ, (1, 3) ์นธ์ ์ถ์ผ๋ก ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํฉ๋๋ค. ๋ค์, ์๋์ชฝ์ผ๋ก 3์นธ ์ด๋ํ๋ฉด ๋ก๋ด์ (4, 3), (5, 3) ๋ ์นธ์ ์ฐจ์งํ๊ฒ ๋ฉ๋๋ค. ์ด์ (5, 3)์ ์ถ์ผ๋ก ์๊ณ ๋ฐฉํฅ์ผ๋ก 90๋ ํ์ ํ, ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ด๋ํ๋ฉด (N, N)์ ๋์ฐฉํฉ๋๋ค. ๋ฐ๋ผ์ ๋ชฉ์ ์ง์ ๋๋ฌํ๊ธฐ๊น์ง ์ต์ 7์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
'Algorithm Problem > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[python] ๋ฐฑ์ค - 2240. ์๋๋๋ฌด (0) | 2020.09.03 |
---|---|
[python] ๋ฐฑ์ค - 9084. ๋์ (0) | 2020.09.02 |
[python] ํ๋ก๊ทธ๋๋จธ์ค - ๊ฐ์ฌ ๊ฒ์(2020 KAKAO BLIND RECRUITMENT) (0) | 2020.08.31 |
[python] ํ๋ก๊ทธ๋๋จธ์ค - ๊ฒฝ์ฃผ๋ก ๊ฑด์ค (2020 ์นด์นด์ค ์ธํด์ญ) (0) | 2020.08.30 |
[python] ํ๋ก๊ทธ๋๋จธ์ค - ์๋ฌผ์ ์ ์ด์ (2020 KAKAO BLIND RECRUITMENT) (2) | 2020.08.29 |