๐Ÿ“š Study/Baekjoon

[Gold III] 1726 - ๋กœ๋ด‡

์œฐ๊ฐฑ 2025. 4. 14. 13:08

๋ฌธ์ œ

๋งŽ์€ ๊ณต์žฅ์—์„œ ๋กœ๋ด‡์ด ์ด์šฉ๋˜๊ณ  ์žˆ๋‹ค. ์šฐ๋ฆฌ ์›”๋“œ ๊ณต์žฅ์˜ ๋กœ๋ด‡์€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ถค๋„๋ฅผ ๋”ฐ๋ผ ์›€์ง์ด๋ฉฐ, ์›€์ง์ด๋Š” ๋ฐฉํ–ฅ์€ ๋™, ์„œ, ๋‚จ, ๋ถ ๊ฐ€์šด๋ฐ ํ•˜๋‚˜์ด๋‹ค. ๋กœ๋ด‡์˜ ์ด๋™์„ ์ œ์–ดํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘ ๊ฐ€์ง€์ด๋‹ค.

  • ๋ช…๋ น 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