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

[์ด์ฝ”ํ…Œ Ch18-47] ์ฒญ์†Œ๋…„ ์ƒ์–ด (๊ตฌํ˜„)

์€์ง„ 2022. 5. 24. 20:54

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

[์ด์ฝ”ํ…Œ Ch18-47] ์ฒญ์†Œ๋…„ ์ƒ์–ด
์ด์ฝ”ํ…Œ

โœ๏ธIdea Sketch

๋ฌธ์ œ์š”์•ฝ

๊ทธ๋ž˜ํ”„ ๊ณต๊ฐ„

4ร—4ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์ด ์žˆ๋‹ค.
ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ํ•œ ๋งˆ๋ฆฌ ์žˆ๋‹ค. ๋ชจ๋“  ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ฒˆํ˜ธ์™€ ๋ฐฉํ–ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
๋ฒˆํ˜ธ๋Š” 1~16์˜ ์ž์—ฐ์ˆ˜์ด๋ฉฐ, ์ค‘๋ณต์€ ์—†๋‹ค.
๋ฐฉํ–ฅ์€ ์ƒํ•˜์ขŒ์šฐ, ๋Œ€๊ฐ์„ ๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ ์ด 8๊ฐ€์ง€์ด๋‹ค. 1๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ โ†‘, โ†–, โ†, โ†™, โ†“, โ†˜, โ†’, โ†— ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. (๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ)


์ด๋™ ํŒจํ„ด

  1. ์ƒ์–ด๊ฐ€ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน๋Š”๋‹ค. ๋งจ ์ฒ˜์Œ์—, ์ƒ์–ด๋Š” (0, 0)์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค.
  2. ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋ถ€ํ„ฐ ์ด๋™ํ•œ๋‹ค.
  3. ์ƒ์–ด๊ฐ€ ์ด๋™ํ•œ๋‹ค.


๋ฌผ๊ณ ๊ธฐ์˜ ์ด๋™

  1. ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋ถ€ํ„ฐ 1์นธ๋งŒ ์ด๋™ํ•œ๋‹ค.
  2. ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋‘ ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
  3. ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ์นธ์ด๊ฑฐ๋‚˜ ๋ฒฝ์ธ ๊ฒฝ์šฐ, ๋ฐฉํ–ฅ์„ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 45๋„์”ฉ ํ‹€๊ณ  ์ด๋™ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•œ๋‹ค.
  4. ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์ด ์—†์œผ๋ฉด ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.


์ƒ์–ด์˜ ์ด๋™

  1. ์ƒ์–ด์˜ ๋ฐฉํ–ฅ์€ ์ตœ๊ทผ์— ์žก์•„ ๋จน์€ ๋ฌผ๊ณ ๊ธฐ์˜ ๋ฐฉํ–ฅ์ด๋‹ค.
  2. ์ƒ์–ด๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค.
  3. ์ข…๋ฃŒ ์กฐ๊ฑด : ์žก์•„ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์ข…๋ฃŒํ•œ๋‹ค.


๋ชฉํ‘œ : ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ ๋ฒˆํ˜ธ์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•ด๋ณด์ž.


์˜ˆ์‹œ

๊ทธ๋ฆผ 1

์ดˆ๊ธฐ ์ƒํƒœ๋Š” ์œ„์™€ ๊ฐ™๋‹ค. ์ƒ์–ด๊ฐ€ (0, 0)์— ์žˆ๋Š” 7๋ฒˆ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๊ณ , ์ƒ์–ด์˜ ๋ฐฉํ–ฅ์€ โ†˜์ด ๋œ๋‹ค.

๊ทธ๋ฆผ 2

์ด์ œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ด๋™ํ•œ๋‹ค. 1๋ฒˆ ๋ฌผ๊ณ ๊ธฐ์˜ ๋ฐฉํ–ฅ์€ โ†—์ด๋‹ค. โ†— ๋ฐฉํ–ฅ์—๋Š” 15๋ฒˆ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋‹ค. ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋‘ ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.

๊ทธ๋ฆผ 3

2๋ฒˆ ๋ฌผ๊ณ ๊ธฐ์˜ ๋ฐฉํ–ฅ์€ โ†์ธ๋ฐ, ๊ทธ ๋ฐฉํ–ฅ์—๋Š” ์ƒ์–ด๊ฐ€ ์žˆ๋‹ค.
๋ฐฉํ–ฅ์„ 45๋„ ๋ฐ˜์‹œ๊ณ„ ํšŒ์ „์„ ํ•˜๋ฉด โ†™๊ฐ€ ๋˜๊ณ , ์ด ์นธ์—๋Š” 3๋ฒˆ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋‹ค. ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ์œผ๋‹ˆ ์„œ๋กœ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค.

๊ทธ๋ฆผ 4

3๋ฒˆ ๋ฌผ๊ณ ๊ธฐ์˜ ๋ฐฉํ–ฅ์€ โ†‘์ด๊ณ , ๋ฒฝ์ด๋‹ค. 45๋„ ๋ฐ˜์‹œ๊ณ„ ํšŒ์ „์„ ํ•œ ๋ฐฉํ–ฅ โ†–๋„ ๋ฒฝ์ด๋‹ˆ, ๋˜ ํšŒ์ „์„ ํ•œ๋‹ค. โ† ๋ฐฉํ–ฅ์—๋Š” ์ƒ์–ด๊ฐ€ ์žˆ์œผ๋‹ˆ ๋˜ ํšŒ์ „ํ•œ๋‹ค. โ†™ ๋ฐฉํ–ฅ์—๋Š” 2๋ฒˆ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ์œผ๋‹ˆ ์„œ๋กœ์˜ ์œ„์น˜๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.

๊ทธ๋ฆผ 5

๋ชจ๋“  ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ด๋™ํ•˜๋ฉด ์œ„์™€ ๊ฐ™๋‹ค.
์ด์ œ ์ƒ์–ด๊ฐ€ ์ด๋™ํ•œ๋‹ค. ์ƒ์–ด์˜ ๋ฐฉํ–ฅ์€ โ†˜์ด๊ณ , 12๋ฒˆ, 15๋ฒˆ, 8๋ฒˆ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋งŒ์•ฝ 8๋ฒˆ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•˜๋ฉด, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

๊ทธ๋ฆผ 6


์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๊ตฌํ˜„, ์‹œ๋ฎฌ๋ ˆ์ด์…˜, ์™„์ „ ํƒ์ƒ‰ (DFS)

์‹œ๋ฎฌ๋ ˆ์ด์…˜๊ณผ ์™„์ „ ํƒ์ƒ‰์„ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ์˜ ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜๋ฏ€๋กœ, ์™„์ „ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์™„์ „ ํƒ์ƒ‰์„ ์œ„ํ•ด DFS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


โœ๏ธ์†Œ์Šค์ฝ”๋“œ


  import copy

  # 4 x 4 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์— ์กด์žฌํ•˜๋Š” ๊ฐ ๋ฌผ๊ณ ๊ธฐ์˜ ๋ฒˆํ˜ธ(์—†์œผ๋ฉด -1)์™€ ๋ฐฉํ–ฅ ๊ฐ’์„ ๋‹ด๋Š” ํ…Œ์ด๋ธ”
  array = [[None] * 4 for _ in range(4)]

  for i in range(4):
      data = list(map(int, input().split()))
      # ๋งค ์ค„๋งˆ๋‹ค 4๋งˆ๋ฆฌ์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ
      for j in range(4):
          # ๊ฐ ์œ„์น˜๋งˆ๋‹ค [๋ฌผ๊ณ ๊ธฐ ๋ฒˆํ˜ธ, ๋ฐฉํ–ฅ]์„ ์ €์žฅ
          array[i][j] = [data[j*2], data[j*2+1]-1]


  # 8๊ฐ€์ง€ ๋ฐฉํ–ฅ ์ •์˜
  dx = [-1, -1, 0, 1, 1, 1, 0, -1]
  dy = [0, -1, -1, -1, 0, 1, 1, 1]

  # ํ˜„์žฌ ์œ„์น˜์—์„œ ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „๋œ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
  def turn_left(direction):
      return (direction + 1) % 8

  result = 0 # ์ตœ์ข…๊ฒฐ๊ณผ

  # ํ˜„์žฌ ๋ฐฐ์—ด์—์„œ ํŠน์ •ํ•œ ๋ฒˆํ˜ธ์˜ ๋ฌผ๊ณ ๊ธฐ ์œ„์น˜ ์ฐพ๊ธฐ
  def find_fish(array, index):
      for i in range(4):
          for j in range(4):
              if array[i][j][0] == index:
                  return (i, j)
      return None

  # ๋ชจ๋“  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ํšŒ์ „ ๋ฐ ์ด๋™์‹œํ‚ค๋Š” ํ•จ์ˆ˜
  def move_all_fishes(array, now_x, now_y):
      # 1๋ฒˆ๋ถ€ํ„ฐ 16๋ฒˆ๊นŒ์ง€์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ (๋‚ฎ์€๋ฒˆํ˜ธ๋ถ€ํ„ฐ) ํ™•์ธ
      for i in range(1, 17):
          # ํ•ด๋‹น ๋ฌผ๊ณ ๊ธฐ์˜ ์œ„์น˜ ์ฐพ๊ธฐ
          position = find_fish(array, i)
          if position != None:
              x, y = position[0], position[1]
              direction = array[x][y][1]
              # ํ•ด๋‹น ๋ฌผ๊ณ ๊ธฐ์˜ ๋ฐฉํ–ฅ์„ ์™ผ์ชฝ์œผ๋กœ ๊ณ„์† ํšŒ์ „์‹œํ‚ค๋ฉฐ ์ด๋™์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
              for _ in range(8):
                  nx = x + dx[direction]
                  ny = y + dy[direction]
                  # ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ด๋™์‹œํ‚ค๊ธฐ
                  if 0 <= nx and nx < 4 and 0 <= ny and ny < 4:
                      if not (nx == now_x and ny == now_y):
                          array[x][y][1] = direction
                          array[x][y], array[nx][ny] = array[nx][ny], array[x][y]
                          break
                  direction = turn_left(direction)

  def get_possible_positions(array, now_x, now_y):
      positions = []
      direction = array[now_x][now_y][1]
      # ํ˜„์žฌ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ„์† ์ด๋™์‹œํ‚ค๊ธฐ
      for i in range(4):
          now_x += dx[direction]
          now_y += dy[direction]
          # ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•˜๋ฉฐ
          if 0 <= now_x and now_x < 4 and 0 <= now_y < 4 :
              # ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ
              if array[now_x][now_y][0] != -1:
                  positions.append((now_x, now_y))
      return positions

  # ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ์œ„ํ•œ DFS ํ•จ์ˆ˜
  def dfs(array, now_x, now_y, total):
      global result
      array = copy.deepcopy(array) # ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ต์งธ๋กœ ๋ณต์‚ฌ

      total += array[now_x][now_y][0] # ํ˜„์žฌ ์œ„์น˜์˜ ๋ฌผ๊ณ ๊ธฐ ๋จน๊ธฐ
      array[now_x][now_y][0] = -1 # ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์—ˆ์œผ๋ฏ€๋กœ ๋ฒˆํ˜ธ ๊ฐ’์„ -1๋กœ ๋ณ€ํ™˜

      move_all_fishes(array, now_x, now_y) # ์ „์ฒด ๋ฌผ๊ณ ๊ธฐ ์ด๋™์‹œํ‚ค๊ธฐ

      # ์ด์ œ ๋‹ค์‹œ ์ƒ์–ด๊ฐ€ ์ด๋™ํ•  ์ฐจ๋ก€์ด๋ฏ€๋กœ, ์ด๋™ ๊ฐ€๋Šฅํ•œ ์œ„์น˜ ์ฐพ๊ธฐ
      positions = get_possible_positions(array, now_x, now_y)
      # ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๊ฐ€ ์—†๋‹ค๋ฉด ์ข…๋ฃŒ
      if len(positions) == 0:
          result = max(result, total) # ์ตœ๋Œ“๊ฐ’ ์ €์žฅ
          return
      # ๋ชจ๋“  ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋กœ ์žฌ๊ท€์  ์ˆ˜ํ–‰
      for next_x, next_y in positions:
          dfs(array, next_x, next_y, total)


  # ์ฒญ์†Œ๋…„ ์ƒ์–ด์˜ ์‹œ์ž‘ ์œ„์น˜(0, 0)์—์„œ๋ถ€ํ„ฐ ์žฌ๊ท€์ ์œผ๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ ํƒ์ƒ‰
  dfs(array, 0, 0, 0)
  print(result)