๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 3190 ๋ฑ€ (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 9. 28.

<๋ฌธ์ œ ๋งํฌ>

https://www.acmicpc.net/problem/3190

 

3190๋ฒˆ: ๋ฑ€

 'Dummy' ๋ผ๋Š” ๋„์Šค๊ฒŒ์ž„์ด ์žˆ๋‹ค. ์ด ๊ฒŒ์ž„์—๋Š” ๋ฑ€์ด ๋‚˜์™€์„œ ๊ธฐ์–ด๋‹ค๋‹ˆ๋Š”๋ฐ, ์‚ฌ๊ณผ๋ฅผ ๋จน์œผ๋ฉด ๋ฑ€ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค. ๋ฑ€์ด ์ด๋ฆฌ์ €๋ฆฌ ๊ธฐ์–ด๋‹ค๋‹ˆ๋‹ค๊ฐ€ ๋ฒฝ ๋˜๋Š” ์ž๊ธฐ์ž์‹ ์˜ ๋ชธ๊ณผ ๋ถ€๋”ชํžˆ๋ฉด ๊ฒŒ์ž„์ด ๋๋‚œ๋‹ค. ๊ฒŒ์ž„

www.acmicpc.net

<ํ’€์ด ์ „๋žต>

  1. ํ์˜ ์„ ์ž…์„ ์ถœ ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•œ ๊ตฌํ˜„ ๋ฌธ์ œ์ด๋‹ค.
  2. ๊ตฌํ˜„ํ•ด์•ผํ•  ์‚ฌํ•ญ๋“ค์€ ๊ฐ„๋žตํ•˜๊ฒŒ ๋‚˜๋ˆ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    1. ๋ฑ€์˜ ์ด๋™
    2. ๊ฒŒ์ž„ ์ข…๋ฃŒ ์กฐ๊ฑด
      • ๋ฒฝ์— ๋ถ€๋”ชํ˜”์„ ๋•Œ(= ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฌ์„ ๋•Œ)
      • ๋ฑ€์˜ ๋ชธํ†ต์— ๋ถ€๋”ชํ˜”์„ ๋•Œ
    3. ์‚ฌ๊ณผ๊ฐ€ ์žˆ์„ ๋•Œ ๋ฑ€์˜ ํฌ๊ธฐ๋ฅผ ์‚ฌ๊ณผ๊ฐ€ ์žˆ๋Š” ์˜์—ญ ํ•œ ์นธ๋งŒํผ ๋Š˜๋ ค์ค€๋‹ค.
    4. ์‚ฌ๊ณผ๊ฐ€ ์—†์„ ๋•Œ ๋ฑ€์˜ ํฌ๊ธฐ๋ฅผ ์œ ์ง€ํ•œ ์ฑ„ ์‚ฌ๊ณผ๊ฐ€ ์žˆ๋Š” ์˜์—ญ์œผ๋กœ ํ•œ ์นธ ์ด๋™ ์‹œ์ผœ์ค€๋‹ค.(๊ผฌ๋ฆฌ -1)
  3. ๋ฑ€์˜ ๋ชธํ†ต์€ ๋ฑ€์ด ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ 
  4. ๋ฑ€์˜ ์ด๋™์€ ํ๋ฅผ ์ด์šฉํ•ด์„œ ๋จธ๋ฆฌ์นธ์„ ํ•œ ์นธ์”ฉ ํ์— append ํ•ด์ฃผ๊ณ , ์‚ฌ๊ณผ๊ฐ€ ์—†์œผ๋ฉด popleft๋กœ ๊ผฌ๋ฆฌ๊ฐ€ ์žˆ๋˜ ์˜์—ญ์„ ๋‹ค์‹œ 0์œผ๋กœ ๋Œ๋ ค์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.
  5. ๊ทธ ์™ธ ์ฃผ์˜ํ•  ์‚ฌํ•ญ์œผ๋กœ๋Š”
    1. ๋ฑ€์ด ์ด๋™์„ ๋งˆ์น˜๊ณ  ๋ฐฉํ–ฅ ์ „ํ™˜์„ ํ•œ๋‹ค๋Š” ์ 
    2. ๋ฌธ์ œ์—์„œ ์ธ๋ฑ์Šค๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์ 

<์ •๋‹ต ์ฝ”๋“œ>

# 220830 3190 ๋ฑ€

# ์ •๋‹ต์ฝ”๋“œ

from collections import deque
import sys
input = sys.stdin.readline

# N: ๋ฐฐ์—ด์˜ ํฌ๊ธฐ, board: ๋ฑ€์ด ์ด๋™ํ•˜๋Š” ๋ฐฐ์—ด
N = int(input())
board = [[0 for _ in range(N)] for _ in range(N)]

# K: ์‚ฌ๊ณผ์˜ ๊ฐœ์ˆ˜
# ์‚ฌ๊ณผ์˜ ์œ„์น˜๋ฅผ ๋ฐฐ์—ด์— ํ‘œ์‹œ(๋ฌธ์ œ์—์„  1-index์ด๊ธฐ ๋•Œ๋ฌธ์— -1)
K = int(input())
for _ in range(K):
    r, c = map(int, input().split())
    board[r- 1][c- 1] = 2

# L: ๋ฐฉํ–ฅ์ „ํ™˜ ํšŸ์ˆ˜, turn: ๋ฐฉํ–ฅ์ „ํ™˜ ์ •๋ณด๋ฅผ ๋‹ด์„ ๋”•์…”๋„ˆ๋ฆฌ
L = int(input())
turn = dict()
for _ in range(L):
    cnt, direction = input().split()
    turn[int(cnt)] = direction

# ํƒ์ƒ‰ ๋ฐฉํ–ฅ (์ฒ˜์Œ์— ์˜ค๋ฅธ์ชฝ์„ ํ–ฅํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์˜ค๋ฅธ์ชฝ์„ ๋ฐ”๋ผ๋ดค์„ ๋•Œ ๊ธฐ์ค€์œผ๋กœ ์‹œ๊ณ„๋ฐฉํ–ฅ)
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]


# snake: ๋ฑ€ ์ด๋™ ํ•จ์ˆ˜
def snake(r, c):
    # cnt: ์ด๋™ ํšŸ์ˆ˜, d: ํƒ์ƒ‰ ๋ฐฉํ–ฅ ์กฐ์ ˆ ๋ณ€์ˆ˜, snake_q: ๋ฑ€์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ํ
    cnt = 0
    d = 0
    snake_q = deque()

    # ์ฒ˜์Œ ๋ฑ€์˜ ์ถœ๋ฐœ์  ํ‘œ์‹œ
    board[r][c] = 1
    snake_q.append((r, c))

    while True:

        # ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์„ธ์ฃผ๊ณ  ํƒ์ƒ‰ ๋ฐฉํ–ฅ๋Œ€๋กœ ์ด๋™
        cnt += 1
        nr = r + dr[d]
        nc = c + dc[d]
        
        # ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๊ฒŒ์ž„ ์ข…๋ฃŒ
        if not 0 <= nr < N or not 0 <= nc < N:
            break
        
        # ์ด๋™ ์œ„์น˜์— ์‚ฌ๊ณผ๊ฐ€ ์žˆ์„ ๋–„
        if board[nr][nc] == 2:
            # ์ด๋™ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๊ณ  ๋ฑ€์˜ ์œ„์น˜๋ฅผ ํ์— ๋„ฃ์–ด์ค€๋‹ค.
            board[nr][nc] = 1
            r, c = nr, nc
            snake_q.append((r, c))
        
        # ์ด๋™ ์œ„์น˜์— ์‚ฌ๊ณผ๊ฐ€ ์—†์„ ๋•Œ
        elif board[nr][nc] == 0:
            # ์ด๋™ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•ด์ฃผ๊ณ  ๋ฑ€์˜ ์œ„์น˜๋ฅผ ํ์— ๋„ฃ์–ด์ค€๋‹ค.
            board[nr][nc] = 1
            r, c = nr, nc
            snake_q.append((r, c))
            # ๋ฑ€์˜ ๊ผฌ๋ฆฌ๋ฅผ ์—†์• ์ค€๋‹ค.
            r_tail, c_tail = snake_q.popleft()
            board[r_tail][c_tail] = 0
        
        # ๋ฑ€์˜ ๋ชธํ†ต์— ๋ถ€๋”ชํ˜”์„ ๋•Œ ๊ฒŒ์ž„ ์ข…๋ฃŒ
        else:
            break
        
        # ์ด๋™์„ ๋งˆ์นœ ๋’ค ํ•ด๋‹น ์‹œํ–‰์—์„œ ๋ฐฉํ–ฅ ์ „ํ™˜์„ ํ•ด์•ผํ•  ๋•Œ
        if cnt in turn:
            # ์ขŒํšŒ์ „
            if turn[cnt] == 'L':
                d = (d - 1) % 4
            # ์šฐํšŒ์ „
            else:
                d = (d + 1) % 4
    
    # ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ํ•จ์ˆ˜ ์ข…๋ฃŒ
    print(cnt)
    return

# ์ถœ๋ฐœ์ ์—์„œ๋ถ€ํ„ฐ ๋ฑ€ ์ด๋™
snake(0, 0)

๋Œ“๊ธ€