๐ฉ๐ปโ๐ป๋ฌธ์ ์ค๋ช
[์ด์ฝํ
Ch18-47] ์ฒญ์๋
์์ด
โ๏ธIdea Sketch
๋ฌธ์ ์์ฝ
๊ทธ๋ํ ๊ณต๊ฐ
4ร4ํฌ๊ธฐ์ ๊ณต๊ฐ์ด ์๋ค.
ํ ์นธ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ํ ๋ง๋ฆฌ ์๋ค. ๋ชจ๋ ๋ฌผ๊ณ ๊ธฐ๋ ๋ฒํธ์ ๋ฐฉํฅ์ ๊ฐ์ง๊ณ ์๋ค.
๋ฒํธ๋ 1~16์ ์์ฐ์์ด๋ฉฐ, ์ค๋ณต์ ์๋ค.
๋ฐฉํฅ์ ์ํ์ข์ฐ, ๋๊ฐ์ ๊น์ง ํฌํจํ์ฌ ์ด 8๊ฐ์ง์ด๋ค. 1๋ถํฐ ์์๋๋ก โ, โ, โ, โ, โ, โ, โ, โ ๋ฅผ ์๋ฏธํ๋ค. (๋ฐ์๊ณ ๋ฐฉํฅ)
์ด๋ ํจํด
- ์์ด๊ฐ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ก์๋จน๋๋ค. ๋งจ ์ฒ์์, ์์ด๋ (0, 0)์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค.
- ๋ฒํธ๊ฐ ์์ ๋ฌผ๊ณ ๊ธฐ๋ถํฐ ์ด๋ํ๋ค.
- ์์ด๊ฐ ์ด๋ํ๋ค.
๋ฌผ๊ณ ๊ธฐ์ ์ด๋
- ๋ฒํธ๊ฐ ์์ ๋ฌผ๊ณ ๊ธฐ๋ถํฐ 1์นธ๋ง ์ด๋ํ๋ค.
- ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ ๋ฌผ๊ณ ๊ธฐ์ ์์น๋ฅผ ๊ตํํ๋ค.
- ์์ด๊ฐ ์๋ ์นธ์ด๊ฑฐ๋ ๋ฒฝ์ธ ๊ฒฝ์ฐ, ๋ฐฉํฅ์ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก 45๋์ฉ ํ๊ณ ์ด๋ ๊ฐ๋ฅํ์ง ํ์ธํ๋ค.
- ์ด๋ํ ์ ์๋ ์นธ์ด ์์ผ๋ฉด ์ด๋ํ์ง ์๋๋ค.
์์ด์ ์ด๋
- ์์ด์ ๋ฐฉํฅ์ ์ต๊ทผ์ ์ก์ ๋จน์ ๋ฌผ๊ณ ๊ธฐ์ ๋ฐฉํฅ์ด๋ค.
- ์์ด๊ฐ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ก์ ๋จน์ ์ ์๋ค.
- ์ข ๋ฃ ์กฐ๊ฑด : ์ก์ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ข ๋ฃํ๋ค.
๋ชฉํ : ์์ด๊ฐ ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ ๋ฒํธ์ ํฉ์ ์ต๋๊ฐ์ ๊ตฌํด๋ณด์.
์์
์ด๊ธฐ ์ํ๋ ์์ ๊ฐ๋ค. ์์ด๊ฐ (0, 0)์ ์๋ 7๋ฒ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๊ณ , ์์ด์ ๋ฐฉํฅ์ โ์ด ๋๋ค.
์ด์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ด๋ํ๋ค. 1๋ฒ ๋ฌผ๊ณ ๊ธฐ์ ๋ฐฉํฅ์ โ์ด๋ค. โ ๋ฐฉํฅ์๋ 15๋ฒ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ค. ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ๊ฒฝ์ฐ, ๋ ๋ฌผ๊ณ ๊ธฐ์ ์์น๋ฅผ ๊ตํํ๋ค.
2๋ฒ ๋ฌผ๊ณ ๊ธฐ์ ๋ฐฉํฅ์ โ์ธ๋ฐ, ๊ทธ ๋ฐฉํฅ์๋ ์์ด๊ฐ ์๋ค.
๋ฐฉํฅ์ 45๋ ๋ฐ์๊ณ ํ์ ์ ํ๋ฉด โ๊ฐ ๋๊ณ , ์ด ์นธ์๋ 3๋ฒ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ค. ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์ผ๋ ์๋ก ์์น๋ฅผ ๋ฐ๊พผ๋ค.
3๋ฒ ๋ฌผ๊ณ ๊ธฐ์ ๋ฐฉํฅ์ โ์ด๊ณ , ๋ฒฝ์ด๋ค. 45๋ ๋ฐ์๊ณ ํ์ ์ ํ ๋ฐฉํฅ โ๋ ๋ฒฝ์ด๋, ๋ ํ์ ์ ํ๋ค. โ ๋ฐฉํฅ์๋ ์์ด๊ฐ ์์ผ๋ ๋ ํ์ ํ๋ค. โ ๋ฐฉํฅ์๋ 2๋ฒ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์ผ๋ ์๋ก์ ์์น๋ฅผ ๊ตํํ๋ค.
๋ชจ๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ด๋ํ๋ฉด ์์ ๊ฐ๋ค.
์ด์ ์์ด๊ฐ ์ด๋ํ๋ค. ์์ด์ ๋ฐฉํฅ์ โ์ด๊ณ , 12๋ฒ, 15๋ฒ, 8๋ฒ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค.
๋ง์ฝ 8๋ฒ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ผ๋ก ์ด๋ํ๋ฉด, ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.
์๊ณ ๋ฆฌ์ฆ : ๊ตฌํ, ์๋ฎฌ๋ ์ด์ , ์์ ํ์ (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)