๋ฌธ์
https://www.acmicpc.net/problem/21608
๋ฐฑ์ค ๋ฌธ์ ์ง - 0x0D๊ฐ - ์๋ฎฌ๋ ์ด์
์๊ณ ๋ฆฌ์ฆ: ์๋ฎฌ๋ ์ด์ , ๊ตฌํ
ํ์ด
์์ด ์ด๋ฑํ๊ต์๋ ๊ต์ค์ด ํ๋ ์๊ณ , ๊ต์ค์ N×N ํฌ๊ธฐ์ ๊ฒฉ์๋ก ๋ํ๋ผ ์ ์๋ค. ํ๊ต์ ๋ค๋๋ ํ์์ ์๋ N2๋ช ์ด๋ค. ์ค๋์ ๋ชจ๋ ํ์์ ์๋ฆฌ๋ฅผ ์ ํ๋ ๋ ์ด๋ค. ํ์์ 1๋ฒ๋ถํฐ N2๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๊ณ , (r, c)๋ rํ c์ด์ ์๋ฏธํ๋ค. ๊ต์ค์ ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์ (1, 1)์ด๊ณ , ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ซ ์นธ์ (N, N)์ด๋ค.
์ ์๋์ ํ์์ ์์๋ฅผ ์ ํ๊ณ , ๊ฐ ํ์์ด ์ข์ํ๋ ํ์ 4๋ช ๋ ๋ชจ๋ ์กฐ์ฌํ๋ค. ์ด์ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ์ด์ฉํด ์ ํด์ง ์์๋๋ก ํ์์ ์๋ฆฌ๋ฅผ ์ ํ๋ ค๊ณ ํ๋ค. ํ ์นธ์๋ ํ์ ํ ๋ช ์ ์๋ฆฌ๋ง ์์ ์ ์๊ณ , |r1 - r2| + |c1 - c2| = 1์ ๋ง์กฑํ๋ ๋ ์นธ์ด (r1, c1)๊ณผ (r2, c2)๋ฅผ ์ธ์ ํ๋ค๊ณ ํ๋ค.
1. ๋น์ด์๋ ์นธ ์ค์์ ์ข์ํ๋ ํ์์ด ์ธ์ ํ ์นธ์ด ๊ฐ์ฅ ๋ง์ ์นธ์ผ๋ก ์๋ฆฌ๋ฅผ ์ ํ๋ค.
2. 1์ ๋ง์กฑํ๋ ์นธ์ด ์ฌ๋ฌ ๊ฐ์ด๋ฉด, ์ธ์ ํ ์นธ ์ค์์ ๋น์ด์๋ ์นธ์ด ๊ฐ์ฅ ๋ง์ ์นธ์ผ๋ก ์๋ฆฌ๋ฅผ ์ ํ๋ค.
3. 2๋ฅผ ๋ง์กฑํ๋ ์นธ๋ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ํ์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ์นธ์ผ๋ก, ๊ทธ๋ฌํ ์นธ๋ ์ฌ๋ฌ ๊ฐ์ด๋ฉด ์ด์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ์นธ์ผ๋ก ์๋ฆฌ๋ฅผ ์ ํ๋ค.
์ด์ ํ์์ ๋ง์กฑ๋๋ฅผ ๊ตฌํด์ผ ํ๋ค. ํ์์ ๋ง์กฑ๋๋ ์๋ฆฌ ๋ฐฐ์น๊ฐ ๋ชจ๋ ๋๋ ํ์ ๊ตฌํ ์ ์๋ค. ํ์์ ๋ง์กฑ๋๋ฅผ ๊ตฌํ๋ ค๋ฉด ๊ทธ ํ์๊ณผ ์ธ์ ํ ์นธ์ ์์ ์ข์ํ๋ ํ์์ ์๋ฅผ ๊ตฌํด์ผ ํ๋ค. ๊ทธ ๊ฐ์ด 0์ด๋ฉด ํ์์ ๋ง์กฑ๋๋ 0, 1์ด๋ฉด 1, 2์ด๋ฉด 10, 3์ด๋ฉด 100, 4์ด๋ฉด 1000์ด๋ค.
ํ์์ ๋ง์กฑ๋์ ์ด ํฉ์ ๊ตฌํด๋ณด์.
์์ด ์๋ฆฌ์ฆ๊ฐ ๊ฝค ๋ง์๊ฒ๊ฐ๋ค.
์ ๋ ฅ ๋ฐ์ดํฐ ์กฐ๊ฑด์ ์๋์ ๊ฐ๋ค.
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N2๊ฐ์ ์ค์ ํ์์ ๋ฒํธ์ ๊ทธ ํ์์ด ์ข์ํ๋ ํ์ 4๋ช ์ ๋ฒํธ๊ฐ ํ ์ค์ ํ๋์ฉ ์ ์๋์ด ์๋ฆฌ๋ฅผ ์ ํ ์์๋๋ก ์ฃผ์ด์ง๋ค.
ํ์์ ๋ฒํธ๋ ์ค๋ณต๋์ง ์์ผ๋ฉฐ, ์ด๋ค ํ์์ด ์ข์ํ๋ ํ์ 4๋ช ์ ๋ชจ๋ ๋ค๋ฅธ ํ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ํ์์ ๋ฒํธ, ์ข์ํ๋ ํ์์ ๋ฒํธ๋ N2๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ์ด๋ค ํ์์ด ์๊ธฐ ์์ ์ ์ข์ํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ ๋ ฅ ๋ฐ์ดํฐ๋ก ์ฃผ์ด์ง ๋ฒํธ ์์ผ๋ก ์๋ฆฌ์ ์ ์ ํด์ผํ๋ค.
์์ ์๋ฆฌ๋ฅผ ์ฐพ๊ธฐ ์ํด ๊ต์ค์ ๋ชจ๋ ์๋ฆฌ๋ฅผ ํ์ํ๋ค.
๋ง์ฝ ๋น์ด์๋ ์๋ฆฌ๋ผ๋ฉด ํด๋น ์๋ฆฌ ๊ธฐ์ค์ผ๋ก ๋์๋จ๋ถ์ ์ฒดํฌํ๋ฉฐ, 1) ์ข์ํ๋ ํ์์ด ์์์๋์ง, 2) ๋น ์๋ฆฌ์ธ์ง ํ์ธํ๋ค.
1์ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์๊ฒฝ์ฐ ๋น์นธ์ ์(2)๋ก ์๋ฆฌ๋ฅผ ๊ฒฐ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ณ์ฐ์ ๋ง์ณค๋ค๋ฉด ํ๋ณด ๋ฆฌ์คํธ์ (์ข์ํ๋ ํ์์ด ์กด์ฌํ๋ ์, ๋น ์๋ฆฌ ์, ํ, ์ด) ํํ๋ก ์ถ๊ฐํ๋ค.
๋ชจ๋ ์๋ฆฌ๋ฅผ ํ์ํ๋ค๋ฉด ํ๋ณด ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ๋ค.
candidates.sort(key=lambda x: (-x[0], -x[1], x[2], x[3]))
์ข์ํ๋ ํ์์ด ๋ง์ ์, ๋น ์๋ฆฌ๊ฐ ๋ง์ ์, ํ์ด ์์ ์, ์ด์ด ์์ ์ ์ผ๋ก ์ ๋ ฌ๋๋ค.
๊ทธ๋ผ ์ ๋ ฌ ํ ๋ฆฌ์คํธ์ 0๋ฒ์งธ๊ฐ์ด ์ต์ ์ ์๋ฆฌ๋ผ๋ ์๋ฆฌ๋ค.
์๋ฆฌ์ ์ขํ๊ฐ์ ์์์ผํ๋ฏ๋ก 0๋ฒ์งธ๊ฐ์ ํ, ์ด ๊ฐ์ ๋ฐํํด์ค๋ค. => candidates[0][2], candidates[0][3]
์ฐธ๊ณ ๋ก ๋๋ ๋งค ์๋ฆฌ๋ง๋ค ์ฃผ์์ ๋น ์๋ฆฌ ๊ฐฏ์๋ฅผ ๊ตฌํ๋๊ฒ ๋นํจ์จ์ ์ด๋ผ ์๊ฐํ๋ค.
๊ทธ๋์ ๊ฐ ์๋ฆฌ๋ง๋ค ์ฃผ์ ๋น์๋ฆฌ์ ๊ฐฏ์๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ empty๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด๋๋ค.
๋ชจ์๋ฆฌ๋ 2, ๊ฐ์ฅ์๋ฆฌ ๋ผ์ธ์ 3, ๊ทธ ์ธ์๋ 4๋ฅผ ์ ์ฅํด๋๋ค.
๋ฐ๋ผ์ ์๋ฆฌ๋ฅผ ์ง์ ํด์ฃผ๊ณ ๋ ๋ค ์ง์ ๋ ์๋ฆฌ ์ฃผ๋ณ ์๋ฆฌ๋ฅผ ์ฒดํฌํ๋ฉฐ, ๋น์๋ฆฌ์ ๊ฐ์๋ฅผ -1 ํด์ค๋ค.
๋ง์ฝ ์ง์ ๋ ์๋ฆฌ์ ์ขํ๊ฐ (2, 2)๋ผ๋ฉด, empty์ (1, 2), (2, 1), (3, 2), (2, 3) ์ขํ ๊ฐ๋ค์ 1์ฉ ๋นผ์ฃผ๋๊ฒ์ด๋ค.
๋ชจ๋ ์๋ฆฌ๋ฅผ ์ง์ ํ๋ค๋ฉด ๋ง์กฑ๋๋ฅผ ๊ตฌํด์ผํ๋ค.
๋ณธ์ธ ์๋ฆฌ์ ์ฃผ๋ณ์ผ๋ก ์ข์ํ๋ ํ์์ด ์์ ์์ ๋ฐ๋ผ ๋ง์กฑ๋๊ฐ ์ ํด์ง๋ค.
0๋ช ์ด๋ฉด 0, 1๋ช ์ด๋ฉด 1, 2๋ช ์ด๋ฉด 10, 3๋ช ์ด๋ฉด 100, 4๋ช ์ด๋ฉด 1000์ด๋ค!
๊ทธ๋ ๋ค. 10์ ์ ๊ณฑ๋งํผ ๋์ด๋๋ ํํ๋ค.
๋จ, 0๋ช ์ผ๋์๋ 0์ด๋ฏ๋ก ์ด ๊ฒฝ์ฐ๋ง ์ ์ธํ๋ฉด ๋๋ค.
if cnt != 0:
satisfaction += 10 ** (cnt - 1)
์ ์ฒด ์ฝ๋
# ๋ฉ๋ชจ๋ฆฌ: 31120KB / ์๊ฐ: 160ms
from sys import stdin
input = stdin.readline
N = int(input())
directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]
room = [[0] * N for _ in range(N)]
empty = [[0] * N for _ in range(N)]
student = {}
for _ in range(N * N):
line = list(map(int, input().split()))
student[line[0]] = line[1:]
for i in range(N):
for j in range(N):
if 0 < i < N-1 and 0 < j < N-1:
empty[i][j] = 4
else:
empty[i][j] = 3
empty[0][0] = empty[0][N-1] = empty[N-1][0] = empty[N-1][N-1] = 2
def checking(number):
candidates = []
for i in range(N):
for j in range(N):
if room[i][j] == 0:
like_cnt = empty_cnt = 0
for dx, dy in directions:
nx, ny = i + dx, j + dy
if 0 <= nx < N and 0 <= ny < N:
if room[nx][ny] in student[number]:
like_cnt += 1
elif room[nx][ny] == 0:
empty_cnt += 1
candidates.append((like_cnt, empty_cnt, i, j))
candidates.sort(key=lambda x: (-x[0], -x[1], x[2], x[3]))
return candidates[0][2], candidates[0][3]
for key in student:
x, y = checking(key)
room[x][y] = key
for dx, dy in directions:
nx, ny = x + dx, y + dy
if 0 <= nx < N and 0 <= ny < N:
empty[nx][ny] -= 1
satisfaction = 0
for i in range(N):
for j in range(N):
number = room[i][j]
cnt = 0
for dx, dy in directions:
nx, ny = i + dx, j + dy
if 0 <= nx < N and 0 <= ny < N:
if room[nx][ny] in student[number]:
cnt += 1
if cnt != 0:
satisfaction += 10 ** (cnt - 1)
print(satisfaction)
์ข์ํ๋ ํ์์ ์๋ฅผ ์นด์ดํธ ํ๋ ๋ถ๋ถ์ ์ข ๋ ํจ์จ์ ์ผ๋ก ๋ฐ๊ฟ ์ ์์๊ฒ๊ฐ์ง๋ง... ์ผ๋จ ํ์๋ค.
๊ฐ๋
์ฑ์ด ์ข์ ์ฝ๋๋ฅผ ์ ํธํ๊ณ ์งํฅํ๋ ํธ์ธ๋ฐ ์ฌ๊ธฐ๋ค ํจ์จ์ฑ๊น์ง ์ฑ๊ธฐ๊ธฐ๊ฐ ์ฝ์ง์๋คใ
ใ
๊ทธ๋๋ ๊ทธ๊ฑธ ์ด๋ค๋ด๋ ์ฒ์ฌ๋ค์ ์ฐธ ๋ง๋ค