๋ฌธ์
[๋ฐฑ์ค ์จ๋ผ์ธ ์ ์ง - 3190๋ฒ](https://www.acmicpc.net/problem/3190)
ํ์ด ๊ณผ์
๋ฑ ๊ฒ์์ ์๋ฎฌ๋ ์ด์ ํด๋ณด๋ ๋ฌธ์ ์ ๋๋ค.
์ฃผ์ํ ์ ์ N์ด ํ์ ํ์ ์ ํ๋ค๋ ๊ฒ์ด N+1 ์ด์ ํ์ ๋ ์์น๋ก์ ์ด๋์ด ์ด๋ฃจ์ด์ง๋ค๋ ๊ฒ์ ๋๋ค.
์ฒ์ ํ๋๋ ์กฐ๊ธ ์ง์ ๋ถํ๊ฒ ํผ ๊ฒ ๊ฐ์์ ๋ค์ ํ์ด๋ดค์ต๋๋ค.
์ฒซ๋ฒ์งธ ์๋
๊ฒ์ํ ์ค์
์ฐ์ ๋ฑ ๊ฒ์ ์๋ฎฌ๋ ์ด์
์ ์ํด (N+2)\*(N+2)
ํฌ๊ธฐ์ ๊ฒ์ํ board
๋ฅผ ์ ์ธํ์๋ค.
๋ฌธ์ ์กฐ๊ฑด์์ ๊ฐ์ฅ์๋ฆฌ๋ ๋ฒฝ์ผ๋ก ํ๊ณ ๊ฒ์ ์์์ง์ ์ 1ํ 1์ด๋ก ํ์์ผ๋ฏ๋ก ๊ตฌํ์ ํธ์์ฑ์ ์ํด ๊ฐ์ฅ์๋ฆฌ๋ฅผ ์ถ๊ฐํ ๊ฒ์ด๋ค.
๋ํ ํ์ฌ ๊ฒ์ํ์ ์ํ๋ฅผ ํํํด์ฃผ๋ ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์ง๊ด์ ์ธ ์ฝ๋ ์์ฑ์ ๊พํ์๋ค.
๋ฑ์ ์ด๋
๊ฐ์ฅ ๊น๋ค๋ก์ด ๋ถ๋ถ์ ๋ฑ์ ์ด๋์ฐ์ฐ์ ๋๋ค.
์ด๋ฅผ ์ํด์๋ ํ์ฌ ๋ฑ์ ์์น์ ๋ฐ๋ ํ์ ๋ฐฉํฅ์ ๊ณ ๋ คํด์ค์ผ ํฉ๋๋ค.
๋ํ ์ด๋์ ๋ฑ์ ๊ผฌ๋ฆฌ๋ ๋ฐ๋ผ์์ผ ํ๋ฏ๋ก ๊ต์ฅํ ๋ณต์กํ ์ฐ์ฐ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
์ฐ์ ๊ฐ ๋ฐฉํฅ(๋, ์, ๋จ, ๋ถ)์ ๋ฐ๋ฅธ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํด์ค์ผ ํฉ๋๋ค.
ํ์ฌ ๋ฐฉํฅ์ ๋ฐ๋ผ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ํ์ ๊ฒฐ๊ณผ๋ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋์ ๋๋ฆฌ ์๋ฃํ์ ์ ์ฅํ ๋ค ์ฌ์ฉํ์์ต๋๋ค.
๋ฑ์ ์ด๋์ ๊ตฌํํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง ๋๋ ๋งค ์ด๋ง๋ค ํ์ ์ฐ์ฐ ๋ชฉ๋ก์ ํ์ธํด์ฃผ๋ฉฐ
์๊ฐ์ด ๋์์ ๋ ํด๋นํ๋ ํ์ ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ง๋๋ก ํ์์ต๋๋ค.
๋ํ ๋จธ๋ฆฌ์ ๊ผฌ๋ฆฌ์ ์ด๋ ๋ฐฉํฅ์ ๊ฐ๊ฐ ๋ฐ๋ก ์ ์งํ๋ฉด์ ํ์ ์ฐ์ฐ์ด ์ด๋ฃจ์ด์ก์ ๊ฒฝ์ฐ ํ์ฌ ์์น์ ๋ค์ ์ด๋ ๋ฐฉํฅ์ ํ์ ์ ์ฅํด์คฌ์ต๋๋ค.
์ด์ฐจํผ ๊ผฌ๋ฆฌ๋ ํ์ฌ ๋ฐฉํฅ์ ๊ธฐ์ค์ผ๋ก ํ ์นธ์ฉ ์ด๋ํ๋๊น ๋ง์ฝ ๊ผฌ๋ฆฌ๊ฐ ์ด์ ์ ํ๋ฒ ๊บพ์ธ ์ง์ ์ ๋๋ฌํ์๋ ์ด์ ์ ํ์ ํ๋ ๋ฐฉํฅ์ผ๋ก ๊ผฌ๋ฆฌ๋ ํ์ ํด์ฃผ๋๋ก ํ๋ฉด ๋๋ ๊ฒ์ ๋๋ค.
์ฝ๋
์ฒซ๋ฒ์งธ ์๋
import sys
from collections import deque
N = int(input())
K = int(input())
apples = []
for _ in range(K):
apples.append(list(map(int, sys.stdin.readline().split())))
L = int(input())
rotate = []
for _ in range(L):
line = list(sys.stdin.readline().split())
rotate.append([int(line[0]), line[1]])
state = {
'blank': 0,
'wall': 1,
'body': 2,
'apple': 3,
}
# ํ์ฌ ๋ฐฉํฅ์ ๊ณ ๋ คํ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์ด๋์ ๋ค์ ๋ฐฉํฅ
next_rotate_dir = {
'e': {'L': 'n', 'D': 's'},
'w': {'L': 's', 'D': 'n'},
's': {'L': 'e', 'D': 'w'},
'n': {'L': 'w', 'D': 'e'},
}
# ๋์๋จ๋ถ ์ด๋ ์ขํ
move_pos = {
'e': [0, 1],
'w': [0, -1],
's': [1, 0],
'n': [-1, 0],
}
def solution():
timer = 0
dir = 'e'
tail_dir = 'e'
head = [1, 1]
tail = [1, 1]
board = [[0 for _ in range(N+2)] for _ in range(N+2)]
rotate.reverse()
rotate_log = deque()
for i in range(N + 2):
board[0][i] = 1
board[i][0] = 1
board[i][N+1] = 1
board[N+1][i] = 1
for apple in apples:
board[apple[0]][apple[1]] = state['apple']
board[1][1] = state['body']
while True:
# ๋ณํ ์๊ฐ์ด ๋๋ฉด
if rotate and timer == rotate[-1][0]:
dir = next_rotate_dir[dir][rotate[-1][1]]
rotate_log.append((head, dir)) # ๋ณํ ์ง์ ๊ณผ ๋ค์ ๋ฐฉํฅ์ ๋ก๊ทธ์ ์ ์ฅ
rotate.pop()
next_head = [head[0] + move_pos[dir][0], head[1] + move_pos[dir][1]]
head = next_head
# ์์ ์ ๋ชธ ํน์ ๋ฒฝ์ ๋จธ๋ฆฌ๊ฐ ๋ฟ์ผ๋ฉด ์ข
๋ฃ
if board[head[0]][head[1]] == state['wall'] or board[head[0]][head[1]] == state['body']:
timer += 1
break
# ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด
elif board[head[0]][head[1]] == state['apple']:
board[head[0]][head[1]] = state['body']
# ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด
else:
board[head[0]][head[1]] = state['body']
board[tail[0]][tail[1]] = state['blank']
# ๋ค์ ๊ผฌ๋ฆฌ ์์น ์ฐพ๊ธฐ
# ํ์ฌ ๊ผฌ๋ฆฌ๊ฐ ์ด์ ์ ๊บพ์ธ ์ง์ ์ด๋ฉด
if rotate_log and tail == rotate_log[0][0]:
tail_dir = rotate_log[0][1]
rotate_log.popleft()
next_tail = [tail[0] + move_pos[tail_dir][0], tail[1] + move_pos[tail_dir][1]]
tail = next_tail
timer += 1
return timer
print(solution())
๋๋ฒ์งธ ์๋
๋ฑ์ deque
์ ์ ์ฅํ ๋ค ๊ฐ ์๊ฐ๋ง๋ค ๋จธ๋ฆฌ๋ฅผ ๊บผ๋ด์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
๋ํ ๊ฐ ํ์ ๋ฐฉํฅ์ ๋์ ๋๋ฆฌ๋ก ํํํ์ง ์๊ณ ๊ทธ๋ฅ ๋ฐฐ์ด์ ์ ์ธํด์คฌ์ต๋๋ค.
import sys
from collections import deque
N = int(input())
K = int(input())
apples = []
for _ in range(K):
apples.append(list(map(int, sys.stdin.readline().split())))
L = int(input())
rotate = []
for _ in range(L):
line = list(sys.stdin.readline().split())
rotate.append([int(line[0]), line[1]])
state = {
'blank': 0,
'wall': 1,
'body': 2,
'apple': 3,
}
# ํ์ฌ ๋ฐฉํฅ์ ๊ณ ๋ คํ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์ด๋์ ๋ค์ ๋ฐฉํฅ
next_rotate_dir = {
'e': {'L': 'n', 'D': 's'},
'w': {'L': 's', 'D': 'n'},
's': {'L': 'e', 'D': 'w'},
'n': {'L': 'w', 'D': 'e'},
}
# ๋์๋จ๋ถ ์ด๋ ์ขํ
move_pos = {
'e': [0, 1],
'w': [0, -1],
's': [1, 0],
'n': [-1, 0],
}
def solution():
timer = 0
dir = 'e'
tail_dir = 'e'
head = [1, 1]
tail = [1, 1]
board = [[0 for _ in range(N+2)] for _ in range(N+2)]
rotate.reverse()
rotate_log = deque()
for i in range(N + 2):
board[0][i] = 1
board[i][0] = 1
board[i][N+1] = 1
board[N+1][i] = 1
for apple in apples:
board[apple[0]][apple[1]] = state['apple']
board[1][1] = state['body']
while True:
# ๋ณํ ์๊ฐ์ด ๋๋ฉด
if rotate and timer == rotate[-1][0]:
dir = next_rotate_dir[dir][rotate[-1][1]]
rotate_log.append((head, dir)) # ๋ณํ ์ง์ ๊ณผ ๋ค์ ๋ฐฉํฅ์ ๋ก๊ทธ์ ์ ์ฅ
rotate.pop()
next_head = [head[0] + move_pos[dir][0], head[1] + move_pos[dir][1]]
head = next_head
# ์์ ์ ๋ชธ ํน์ ๋ฒฝ์ ๋จธ๋ฆฌ๊ฐ ๋ฟ์ผ๋ฉด ์ข
๋ฃ
if board[head[0]][head[1]] == state['wall'] or board[head[0]][head[1]] == state['body']:
timer += 1
break
# ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด
elif board[head[0]][head[1]] == state['apple']:
board[head[0]][head[1]] = state['body']
# ์ฌ๊ณผ๊ฐ ์๋ค๋ฉด
else:
board[head[0]][head[1]] = state['body']
board[tail[0]][tail[1]] = state['blank']
# ๋ค์ ๊ผฌ๋ฆฌ ์์น ์ฐพ๊ธฐ
# ํ์ฌ ๊ผฌ๋ฆฌ๊ฐ ์ด์ ์ ๊บพ์ธ ์ง์ ์ด๋ฉด
if rotate_log and tail == rotate_log[0][0]:
tail_dir = rotate_log[0][1]
rotate_log.popleft()
next_tail = [tail[0] + move_pos[tail_dir][0], tail[1] + move_pos[tail_dir][1]]
tail = next_tail
timer += 1
return timer
print(solution())
'๐ algorithm > boj' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ 19941 - ํ๋ฒ๊ฑฐ ๋ถ๋ฐฐ (0) | 2021.03.08 |
---|---|
BOJ 16469 - ์๋ ์ ํ (0) | 2021.03.05 |
BOJ 13565 - ์นจํฌ (0) | 2021.03.05 |
BOJ 1105 - ํ (0) | 2021.03.03 |
BOJ 16509 - ์ฅ๊ตฐ (0) | 2021.03.03 |
๐ฌ ๋๊ธ