ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

[๋ฐฑ์ค€ 3190] ๋ฑ€ (Python)

์€์ง„ 2022. 6. 21. 20:48

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๋ฌธ์ œ์„ค๋ช…

[๋ฐฑ์ค€ 3190] ๋ฑ€ (Python)
์ด์ฝ”ํ…Œ


๋ฌธ์ œ์š”์•ฝ

(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)