๐ฉ๐ปโ๐ป๋ฌธ์ ์ค๋ช
๋ฌธ์ ์์ฝ
(0, 0) ์ง์ ์์ ์์ํ๊ณ , ๋จธ๋ฆฌ๋ ์ค๋ฅธ์ชฝ์ ๋ฐ๋ผ๋ณด๊ณ ์๋ค.
๋จธ๋ฆฌ : ํญ์ ์ด๋ํ ๋ค์ ์นธ์ ๋ฐ๋ผ๋ณด๊ณ ์๋ค.
์ด๋ํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ ๊ฒฝ์ฐ : ๊ผฌ๋ฆฌ๋ ์์ง์ด์ง ์์
์ด๋ํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ ๊ฒฝ์ฐ : ๊ผฌ๋ฆฌ์นธ ๋น์ฐ๊ธฐ
์ข
๋ฃ ์กฐ๊ฑด : ์๊ธฐ ์์ ๋๋ ๋ฒฝ๊ณผ ๋ฟ์์ ๋ ์ข
๋ฃํ๋ค.
๊ฒ์์ด ๋ช ์ด ๋ค์ ๋๋๋๊ฐ?
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ณด๋์ ํฌ๊ธฐ N์ด ์ฃผ์ด์ง๋ค. (2 โค N โค 100) ๋ค์ ์ค์ ์ฌ๊ณผ์ ๊ฐ์ K๊ฐ ์ฃผ์ด์ง๋ค. (0 โค K โค 100)
๋ค์ K๊ฐ์ ์ค์๋ ์ฌ๊ณผ์ ์์น๊ฐ ์ฃผ์ด์ง๋๋ฐ, ์ฒซ ๋ฒ์งธ ์ ์๋ ํ, ๋ ๋ฒ์งธ ์ ์๋ ์ด ์์น๋ฅผ ์๋ฏธํ๋ค. ์ฌ๊ณผ์ ์์น๋ ๋ชจ๋ ๋ค๋ฅด๋ฉฐ, ๋งจ ์ ๋งจ ์ข์ธก (1ํ 1์ด) ์๋ ์ฌ๊ณผ๊ฐ ์๋ค.
๋ค์ ์ค์๋ ๋ฑ์ ๋ฐฉํฅ ๋ณํ ํ์ L ์ด ์ฃผ์ด์ง๋ค. (1 โค L โค 100)
๋ค์ L๊ฐ์ ์ค์๋ ๋ฑ์ ๋ฐฉํฅ ๋ณํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋๋ฐ, ์ ์ X์ ๋ฌธ์ C๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ. ๊ฒ์ ์์ ์๊ฐ์ผ๋ก๋ถํฐ X์ด๊ฐ ๋๋ ๋ค์ ์ผ์ชฝ(C๊ฐ 'L') ๋๋ ์ค๋ฅธ์ชฝ(C๊ฐ 'D')๋ก 90๋ ๋ฐฉํฅ์ ํ์ ์ํจ๋ค๋ ๋ป์ด๋ค. X๋ 10,000 ์ดํ์ ์์ ์ ์์ด๋ฉฐ, ๋ฐฉํฅ ์ ํ ์ ๋ณด๋ X๊ฐ ์ฆ๊ฐํ๋ ์์ผ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฒ์์ด ๋ช ์ด์ ๋๋๋์ง ์ถ๋ ฅํ๋ค.
์์ ์
๋ ฅ 1
6
3
3 4
2 5
5 3
3
3 D
15 L
17 D
์์ ์ถ๋ ฅ 1
9
์์ ์
๋ ฅ 2
10
4
1 2
1 3
1 4
1 5
4
8 D
10 D
11 D
13 L
์์ ์ถ๋ ฅ 2
21
์์ ์
๋ ฅ 3
10
5
1 5
1 3
1 2
1 6
1 7
4
8 D
10 D
11 D
13 L
์์ ์ถ๋ ฅ 3
13
โ๏ธIdea Sketch
์๊ณ ๋ฆฌ์ฆ : ๊ตฌํ
๋ฌธ์ ์์ ์ฃผ์ด์ง ๋๋ก ๋ก์ง์ ์์ฑํ๋ฉด ๋๋ ๊ตฌํ ๋ฌธ์ ์ด๋ค. ๋ฑ์ ๋จธ๋ฆฌ์นธ๊ณผ ๊ผฌ๋ฆฌ์นธ์ ๊ณ์ ๊ฐฑ์ ํด์ผ ํ๋ฏ๋ก Queue๋ก ๊ตฌํํ์๋ค.
์๊ฐ๋ณต์ก๋
O(n)
์ฒซ์งธ ์ค์ ๋ณด๋์ ํฌ๊ธฐ N์ด ์ฃผ์ด์ง๋ค. (2 โค N โค 100) โฆ ๊ฒ์ ์์ ์๊ฐ์ผ๋ก๋ถํฐ X์ด๊ฐ ๋๋ ๋ค์ ์ผ์ชฝ(C๊ฐ 'L') ๋๋ ์ค๋ฅธ์ชฝ(C๊ฐ 'D')๋ก 90๋ ๋ฐฉํฅ์ ํ์ ์ํจ๋ค๋ ๋ป์ด๋ค. X๋ 10,000 ์ดํ์ ์์ ์ ์์ด๋ฉฐ, โฆ
์ ๊ธ์ ํตํด ์ต์ ์ ๊ฒฝ์ฐ 10,000์ด์ผ ๋ ๋ง์ง๋ง์ผ๋ก ๋ฐฉํฅ์ ๋ณํํ๊ณ ๊ณ์ ์ง์งํจ์ ์ ์ ์๋ค. ๋ณด๋์ ํฌ๊ธฐ N๋ ์ต๋ 100์ด๋ฏ๋ก 100์ด ํ์๋ ๋ฌด์กฐ๊ฑด ๋ฒฝ์ ๋ถ๋ชํ๋ค. ๋ฐ๋ผ์ ๋ฑ์ ์ต๋ ์ด๋์๊ฐ์ ์ฝ 10,100์ด์ด๋ค.
โ๏ธ๋ด ์์ค์ฝ๋
- 2์ฐจ์ ๋ฐฐ์ด graph์ ์ฌ๊ณผ ์์น๋ฅผ 1๋ก ํ์ํ๋ค.
- ๋ฑ์ ๋จธ๋ฆฌ์นธ๊ณผ ๊ผฌ๋ฆฌ์นธ์ ๊ณ์ ๊ฐฑ์ ํด์ผ ํ๋ฏ๋ก Queue๋ก ๊ตฌํํ๋ค. ์ด ๋ ๋ฑ์ ์ขํ์ ๋ฐฉํฅ ์ ๋ณด 2๊ฐ๊ฐ ํ์ํ๋ฏ๋ก Queue๋ฅผ 2๊ฐ ์ฌ์ฉํ๋ค.
snake, direction
- ๋ฑ์ ๋ฐฉํฅ ๋ณํ ์ ๋ณด turnHead๋ Queue๋ก ๊ตฌํํ๋ค.
- ๋ฐ๋ณต๋ฌธ์์ ๋ฑ์ ์ต๋ ์ด๋์๊ฐ์ ์ฝ 10,100์ด์ด๋ ์ฌ์ ๋กญ๊ฒ 20,000์ผ๋ก ์ค์ ํ๋ค.
for time in range(1, 20000):
- ๋ฑ์ ๋จธ๋ฆฌ๊ฐ ์ด๋ํ ์นธ nx, ny๋ฅผ ์ ์ธํ๊ณ , ์๊ธฐ์์ ๋๋ ๋ฒฝ๊ณผ ๋ถ๋ชํ๋์ง ํ์ธํ๋ค. (์ข ๋ฃ ์กฐ๊ฑด)
- ๊ณ์ ์งํํ๋ค๋ฉด, ๋ฑ์ ๋จธ๋ฆฌ๊ฐ ์ด๋ํ ์นธ nx, ny์ ๋ฐฉํฅ ์ ๋ณด๋ฅผ
snake, direction
Queue์ ์ถ๊ฐํ๋ค. - ๋ฐฉํฅ์ ๋ณํํ ํ์ด๋ฐ์ธ ๊ฒฝ์ฐ, ๋ณํํ ๋ฐฉํฅ ์ ๋ณด๋ฅผ
direction
Queue์ ์ถ๊ฐํด์ผ ํ๋ค. - ์ด๋ํ ์นธ์ ์ฌ๊ณผ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ๊ณผ๋ฅผ ์์ ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๊ผฌ๋ฆฌ์นธ์ ๋น์ด๋ค.
import sys
from collections import deque
si = sys.stdin.readline
# ์ค๋ฅธ์ชฝ, ์๋์ชฝ, ์ผ์ชฝ, ์์ชฝ (์๊ณ๋ฐฉํฅ) --> L์ด๋ฉด -1, D๋ฉด +1 index
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]
n = int(si())
graph = [[0] * n for _ in range(n)]
k = int(si())
for _ in range(k):
a, b = map(int, si().split())
graph[a-1][b-1] = 1 # ์ฌ๊ณผ
snake = deque([(0, 0)])
direction = deque([0])
l = int(si())
turnHead = deque()
for _ in range(l):
x, c = si().split()
turnHead.append((int(x), c))
for time in range(1, 20000):
hx, hy = snake[0]
nx, ny = hx + dx[direction[0]], hy + dy[direction[0]]
if (nx, ny) in snake:
break
if not (0 <= nx < n) or not (0 <= ny < n):
break
snake.appendleft((nx, ny))
if turnHead and time == turnHead[0][0]:
x, c = turnHead.popleft()
if c == 'L':
direction.appendleft((direction[0] + 3) % 4)
else:
direction.appendleft((direction[0] + 1) % 4)
else:
direction.appendleft(direction[0])
if graph[nx][ny] == 1:
graph[nx][ny] = 0
else:
snake.pop()
direction.pop()
print(time)