๋ฌธ์
๋ง์ ๊ณต์ฅ์์ ๋ก๋ด์ด ์ด์ฉ๋๊ณ ์๋ค. ์ฐ๋ฆฌ ์๋ ๊ณต์ฅ์ ๋ก๋ด์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ผ๋ก ๊ถค๋๋ฅผ ๋ฐ๋ผ ์์ง์ด๋ฉฐ, ์์ง์ด๋ ๋ฐฉํฅ์ ๋, ์, ๋จ, ๋ถ ๊ฐ์ด๋ฐ ํ๋์ด๋ค. ๋ก๋ด์ ์ด๋์ ์ ์ดํ๋ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ง์ด๋ค.
- ๋ช ๋ น 1. Go k: k๋ 1, 2 ๋๋ 3์ผ ์ ์๋ค. ํ์ฌ ํฅํ๊ณ ์๋ ๋ฐฉํฅ์ผ๋ก k์นธ ๋งํผ ์์ง์ธ๋ค.
- ๋ช ๋ น 2. Turn dir: dir์ left ๋๋ right ์ด๋ฉฐ, ๊ฐ๊ฐ ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก 90° ํ์ ํ๋ค.
๊ณต์ฅ ๋ด ๊ถค๋๊ฐ ์ค์น๋์ด ์๋ ์ํ๊ฐ ์๋์ ๊ฐ์ด 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ์ง์ฌ๊ฐํ ๋ชจ์์ผ๋ก ๋ก๋ด์๊ฒ ์ ๋ ฅ๋๋ค. 0์ ๊ถค๋๊ฐ ๊น๋ ค ์์ด ๋ก๋ด์ด ๊ฐ ์ ์๋ ์ง์ ์ด๊ณ , 1์ ๊ถค๋๊ฐ ์์ด ๋ก๋ด์ด ๊ฐ ์ ์๋ ์ง์ ์ด๋ค. ๋ก๋ด์ด (4, 2) ์ง์ ์์ ๋จ์ชฝ์ ํฅํ๊ณ ์์ ๋, ์ด ๋ก๋ด์ (2, 4) ์ง์ ์์ ๋์ชฝ์ผ๋ก ํฅํ๋๋ก ์ด๋์ํค๋ ๊ฒ์ ์๋์ ๊ฐ์ด 9๋ฒ์ ๋ช ๋ น์ผ๋ก ๊ฐ๋ฅํ๋ค.

๋ก๋ด์ ํ์ฌ ์์น์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ด ์ฃผ์ด์ก์ ๋, ๋ก๋ด์ ์ํ๋ ์์น๋ก ์ด๋์ํค๊ณ , ์ํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ผ๋ณด๋๋ก ํ๋๋ฐ ์ต์ ๋ช ๋ฒ์ ๋ช ๋ น์ด ํ์ํ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ณต์ฅ ๋ด ๊ถค๋ ์ค์น ์ํ๋ฅผ ๋ํ๋ด๋ ์ง์ฌ๊ฐํ์ ์ธ๋ก ๊ธธ์ด M๊ณผ ๊ฐ๋ก ๊ธธ์ด N์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ์ด๋ M๊ณผ N์ ๋ ๋ค 100์ดํ์ ์์ฐ์์ด๋ค. ์ด์ด M์ค์ ๊ฑธ์ณ ํ ์ค์ N๊ฐ์ฉ ๊ฐ ์ง์ ์ ๊ถค๋ ์ค์น ์ํ๋ฅผ ๋ํ๋ด๋ ์ซ์ 0 ๋๋ 1์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ ๋ก๋ด์ ์ถ๋ฐ ์ง์ ์ ์์น (ํ๊ณผ ์ด์ ๋ฒํธ)์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋ง์ง๋ง ์ค์๋ ๋ก๋ด์ ๋์ฐฉ ์ง์ ์ ์์น (ํ๊ณผ ์ด์ ๋ฒํธ)์ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ด ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค. ๋ฐฉํฅ์ ๋์ชฝ์ด 1, ์์ชฝ์ด 2, ๋จ์ชฝ์ด 3, ๋ถ์ชฝ์ด 4๋ก ์ฃผ์ด์ง๋ค. ์ถ๋ฐ์ง์ ์์ ๋์ฐฉ์ง์ ๊น์ง๋ ํญ์ ์ด๋์ด ๊ฐ๋ฅํ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ก๋ด์ ๋์ฐฉ ์ง์ ์ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ์ด๋์ํค๋๋ฐ ํ์ํ ์ต์ ๋ช ๋ น ํ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1 ๋ณต์ฌ
5 6
0 0 0 0 0 0
0 1 1 0 1 0
0 1 0 0 0 0
0 0 1 1 1 0
1 0 0 0 0 0
4 2 3
2 4 1
์์ ์ถ๋ ฅ 1 ๋ณต์ฌ
9
# ํ์ด ๋ฐฉ๋ฒ
์ต์ ๋ช ๋ น ํ์๋ฅผ ๋ฌผ์ด๋ดค๊ธฐ ๋๋ฌธ์ bfs๋ก ์ ๊ทผํ๋ค.
๋๊ฐ์ง ๋ถ๋ถ์์ ์ค์๊ฐ ์์๋ค
- ๋ช ๋ น1: ์กฐ๊ฑด์ ํ์ค๋ก ์ฐ๋ ค๋ค ๋ณด๋ ์ค์๊ฐ ์์๋ค. go1๋ถํฐ ์๋๋๊ฑฐ๋ฉด go3๊น์ง ๊ฐ ํ์๊ฐ ์๋ค
- ๋ช ๋ น2: ๋์๋จ๋ถ ์ค๋ฅธ์ชฝ 90๋ ํ์ ํ ๋ ๊ท์น์ ์ฐพ์ผ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค. ๊ทธ๋ฐ๊ฒ ์์ด ๊ทธ๋ฅ ๊ตฌํํ๋ฉด ๋์๋ค
๋, cnt๋ฅผ ๊ตฌํด์ผ ํ ๋๋ ๊ฐ์ด queue์ ๋ฃ๋ ๊ฒ์ด ์ข๋ค
# ์ฝ๋
<์ฝ๋2>๊ฐ ํ๋ฆฐ ์ด์ ์ ๋ํ gpt ์ค๋ช
โ ๊ตฌ์ฒด์ ์ธ ์์ ๋ค์ด๋ณผ๊ฒ
- 1์นธ ๊ฐ๊ธฐ, 2์นธ ๊ฐ๊ธฐ, 3์นธ ๊ฐ๊ธฐ๋ฅผ ๊ฐ๊ฐ ์๋ํ๋๋ฐ
- 1์นธ ์ด๋์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ขํ๋ผ๊ณ ์น์.
<์ฝ๋1> ํ๋ฆ
- 1์นธ ์ด๋: ๋ฐฉ๋ฌธํ์ผ๋ฉด ๋ฌด์ํ๊ณ 2์นธ, 3์นธ ์ด๋ ๊ณ์ ์๋ํจ
<์ฝ๋2> ํ๋ฆ
- 1์นธ ์ด๋: ๋ฐฉ๋ฌธํ ๊ณณ์ด๋๊น ๋ฐ๋ก break (→ 2์นธ, 3์นธ ์ด๋๋ ๋ชปํจ)
๊ฒฐ๊ตญ <์ฝ๋2>๋ "๋ฐฉ๋ฌธํ๋ ์นธ์ด ์๋ค"๋ ์ด์ ๋ง์ผ๋ก 3์นธ ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ์์ ์๋๋ ๋ชปํ๊ณ ๋์ด๋ฒ๋ฆฌ๋ ๊ฑฐ์ผ.
๐ ์์๋ก ์ดํดํด๋ณด์
์ํฉ:
- (0,0) ์์ ๋์ชฝ(์ค๋ฅธ์ชฝ, d=1)์ผ๋ก ์ด๋ ์ค
- (0,1)์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ด์ผ (๋ค๋ฅธ ๊ฒฝ๋ก์์ ๋ค๋ ์์ด)
- (0,2)๋ ์์ง ๋ฐฉ๋ฌธ ์ ํ ๊ณณ
์ง๋ฌธ: (0,0) → (0,1) → (0,2)๋ก ๊ฐ ์ ์๋?
๋ต:
- (0,1)์ "ํต๊ณผ"ํ๋ ๊ฑด ๋ฌธ์ ์์ด.
- ๋จ, (0,1)์ ๋์ฐฉํด์ ๋ "๊ฑฐ๊ธฐ์๋ถํฐ ์๋ก ํ์"ํ๋ ๊ฑธ ๋ง์ ๋ฟ์ด์ผ.
- ๋ชฉํ๋ (0,2)์ ๋๋ฌํ๋ ๊ฑฐ๋๊น 2์นธ ์ด๋์ ์ ์์ ์ผ๋ก ํ ์ ์์ด.
โ ์์ฝ:
- "์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ ํต๊ณผ"ํ๋ ๊ฑด ๊ด์ฐฎ์.
- "์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ ๋ค์ ๋์ฐฉํด์ ๊ฑฐ๊ธฐ์๋ถํฐ ์ BFS๋ฅผ ํ๋ ค๋ ๊ฒ"๋ง ๋ง๋ ๊ฑฐ์ผ.
import sys
sys.stdin = open("input.txt","r")
from collections import deque
M, N = map(int,sys.stdin.readline().split())
graph = [list(map(int,sys.stdin.readline().split())) for _ in range(M)]
sx,sy,sd = map(int,sys.stdin.readline().split())
tx,ty,td = map(int,sys.stdin.readline().split())
# ๋1/์2/๋จ3/๋ถ4
dx = [None, 0,0,1,-1]
dy = [None, 1,-1,0,0]
def turn_left(d):
if d == 1: return 4
elif d == 4: return 2
elif d == 2: return 3
elif d == 3: return 1
def turn_right(d):
if d == 1: return 3
elif d == 3: return 2
elif d == 2: return 4
elif d == 4: return 1
visited = set()
def bfs(x,y,d):
queue = deque()
queue.append((x,y,d,0))
while queue:
x,y,d,cnt = queue.popleft()
visited.add((x,y,d))
if (x,y,d) == (tx-1,ty-1,td):
return cnt
# ๋ช
๋ น 1. Go k: k๋ 1, 2 ๋๋ 3์ผ ์ ์๋ค. ํ์ฌ ํฅํ๊ณ ์๋ ๋ฐฉํฅ์ผ๋ก k์นธ ๋งํผ ์์ง์ธ๋ค.
for i in range(1,4):
nx, ny = x + i*dx[d], y + i*dy[d]
# <์ฝ๋1> -- ์ ๋ต
if not (0 <= nx < M and 0 <= ny < N):
break
if graph[nx][ny] == 1:
break
if (nx,ny,d) not in visited:
visited.add((nx,ny,d))
queue.append((nx,ny,d,cnt+1))
# <์ฝ๋2> -- ์ค๋ต
if 0 <= nx < M and 0 <= ny < N and (nx,ny,d) not in visited and graph[nx][ny] == 0:
visited.add((nx,ny,d))
queue.append((nx,ny,d,cnt+1))
else:
break
# ๋ช
๋ น 2. Turn dir: dir์ left ๋๋ right ์ด๋ฉฐ, ๊ฐ๊ฐ ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก 90° ํ์ ํ๋ค.
for func in (turn_left, turn_right):
new_d = func(d)
if (x,y,new_d) not in visited:
visited.add((x,y,new_d))
queue.append((x,y,new_d,cnt+1))
print(bfs(sx-1,sy-1,sd))
import sys
# sys.stdin = open("input.txt","r")
from collections import deque
# ๋1 / ์2 / ๋จ3 / ๋ถ4
dx = [None, 0, 0, 1, -1]
dy = [None, 1, -1, 0, 0]
n, m = map(int,sys.stdin.readline().split())
graph = [list(map(int,sys.stdin.readline().split())) for _ in range(n)]
sx, sy, sd = map(int,sys.stdin.readline().split())
tx, ty, td = map(int,sys.stdin.readline().split())
visited = set()
def turn_left(d):
if d == 1: return 4
elif d == 4: return 2
elif d == 2: return 3
elif d == 3: return 1
def turn_right(d):
if d == 1: return 3
elif d == 3: return 2
elif d == 2: return 4
elif d == 4: return 1
def bfs(x,y,d):
cnt = 0
queue = deque()
queue.append((x,y,d,cnt))
while queue:
x, y, d, cnt = queue.popleft()
visited.add((x,y,d))
if (x,y,d) == (tx-1,ty-1,td):
return cnt
# ๋ช
๋ น 1. Go k: k๋ 1, 2 ๋๋ 3์ผ ์ ์๋ค.
# ํ์ฌ ํฅํ๊ณ ์๋ ๋ฐฉํฅ์ผ๋ก k์นธ ๋งํผ ์์ง์ธ๋ค.
for i in range(1,4):
nx, ny = x + dx[d] * i, y + dy[d] * i
if not (0 <= nx < n and 0 <= ny < m):
break
if graph[nx][ny] == 1:
break
if (nx,ny,d) not in visited:
visited.add((nx,ny,d))
queue.append((nx,ny,d,cnt+1))
# ๋ช
๋ น 2. Turn dir: dir์ left ๋๋ right ์ด๋ฉฐ, ๊ฐ๊ฐ ์ผ์ชฝ ๋๋ ์ค๋ฅธ์ชฝ์ผ๋ก 90° ํ์ ํ๋ค.
# ๋ชจ๋ ๋ฐฉํฅ์ ๋ํด ํ์ ํด์ผ ํจ
# ํ์
for turn_func in (turn_left, turn_right):
nd = turn_func(d)
if (x, y, nd) not in visited:
visited.add((x,y,nd))
queue.append((x, y, nd, cnt + 1))
print(bfs(sx-1,sy-1,sd))
# ์ฐธ๊ณ (๋ฐํ์ ์ค๋ฅ ํด๊ฒฐ)
๋ฏธ์์ฑ์ฝ๋.. ์ฒซ ์๋
# 2025-04-13 04:51-05:30
import sys
from collections import deque
sys.stdin = open("input.txt","r")
m, n = map(int,sys.stdin.readline().split())
graph = [list(map(int,sys.stdin.readline().split())) for _ in range(m)]
r1,c1,d1 = map(int,sys.stdin.readline().split())
r2,c2,d2 = map(int,sys.stdin.readline().split())
# ๋ ์ ๋จ ๋ถ
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
def bfs(x,y,d):
visited = [[[False]*4 for _ in range(n)] for _ in range(m)]
cnt = 0
queue = deque()
queue.append((x,y,d,cnt))
visited[x][y][d] = True # ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
while queue:
x, y, d, cnt = queue.popleft()
# print((x,y,d, cnt))
if x == r2-1 and y == c2-1 and d == d2-1: # ๋ชฉ์ ์ง์ ๋์ฐฉํ์ ๊ฒฝ์ฐ ์ข
๋ฃ
return cnt
# ๋ช
๋ น1: go k(=1,2,3)
for i in range(1,4):
nx, ny = x + dx[d]*i, y + dy[d]*i
if 0 <= nx < m and 0 <= ny < n:
if graph[nx][ny] == 1:
break
if not visited[nx][ny][d]:
visited[nx][ny][d] = True
queue.append((nx,ny,d,cnt+1))
else:
break
# ๋ช
๋ น2: turn dir (left, right) 90๋
d_left = (d + 3) % 4
if not visited[x][y][d_left]:
visited[x][y][d_left] = True
queue.append((x,y,d_left,cnt+1))
d_right = (d + 1) % 4
if not visited[x][y][d_right]:
visited[x][y][d_right] = True
queue.append((x,y,d_right,cnt+1))
# print(f'graph[{x}][{y}] = {graph[x][y]}')
print(bfs(r1-1,c1-1,d1-1))
'๐ Study > Baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Gold IV] 3055 - ํ์ถ (0) | 2025.04.15 |
---|---|
[Gold IV] 1987 - ์ํ๋ฒณ (0) | 2025.04.14 |
[Gold V] 14503 - ๋ก๋ด ์ฒญ์๊ธฐ (0) | 2025.04.13 |
[Silver II] 2644 - ์ด์๊ณ์ฐ (0) | 2025.04.12 |
[Silver I] 1697- ์จ๋ฐ๊ผญ์ง (0) | 2025.04.10 |