[BOJ][๐ก5][๋ฐฑ์ค#21608] ์์ด ์ด๋ฑํ๊ต
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์์ด ์ด๋ฑํ๊ต์๋ ๊ต์ค์ด ํ๋ ์๊ณ , ๊ต์ค์ 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๋ฅผ ๋ง์กฑํ๋ ์นธ๋ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ํ์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ์นธ์ผ๋ก, ๊ทธ๋ฌํ ์นธ๋ ์ฌ๋ฌ ๊ฐ์ด๋ฉด ์ด์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ์์ ์นธ์ผ๋ก ์๋ฆฌ๋ฅผ ์ ํ๋ค.
์๋ฅผ ๋ค์ด, N = 3์ด๊ณ , ํ์ N2๋ช ์ ์์์ ๊ฐ ํ์์ด ์ข์ํ๋ ํ์์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
ํ์์ ๋ฒํธ ์ข์ํ๋ ํ์์ ๋ฒํธ
4 2, 5, 1, 7
3 1, 9, 4, 5
9 8, 1, 2, 3
8 1, 9, 3, 4
7 2, 3, 4, 8
1 9, 2, 5, 7
6 5, 2, 3, 4
5 1, 9, 2, 8
2 9, 3, 1, 4
๊ฐ์ฅ ๋จผ์ , 4๋ฒ ํ์์ ์๋ฆฌ๋ฅผ ์ ํด์ผ ํ๋ค. ํ์ฌ ๊ต์ค์ ๋ชจ๋ ์นธ์ ๋น ์นธ์ด๋ค. 2๋ฒ ์กฐ๊ฑด์ ์ํด ์ธ์ ํ ์นธ ์ค์์ ๋น์ด์๋ ์นธ์ด ๊ฐ์ฅ ๋ง์ ์นธ์ธ (2, 2)์ด 4๋ฒ ํ์์ ์๋ฆฌ๊ฐ ๋๋ค.
ย ย ย
ย 4 ย
ย ย ย
๋ค์ ํ์์ 3๋ฒ์ด๋ค. 1๋ฒ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์นธ์ (1, 2), (2, 1), (2, 3), (3, 2) ์ด๋ค. ์ด ์นธ์ ๋ชจ๋ ๋น์ด์๋ ์ธ์ ํ ์นธ์ด 2๊ฐ์ด๋ค. ๋ฐ๋ผ์, 3๋ฒ ์กฐ๊ฑด์ ์ํด (1, 2)๊ฐ 3๋ฒ ํ์์ ์๋ฆฌ๊ฐ ๋๋ค.
ย 3 ย
ย 4 ย
ย ย ย
๋ค์์ 9๋ฒ ํ์์ด๋ค. 9๋ฒ ํ์์ด ์ข์ํ๋ ํ์์ ๋ฒํธ๋ 8, 1, 2, 3์ด๊ณ , ์ด ์ค์ 3์ ์๋ฆฌ์ ์์์๋ค. ์ข์ํ๋ ํ์์ด ๊ฐ์ฅ ๋ง์ด ์ธ์ ํ ์นธ์ (1, 1), (1, 3)์ด๋ค. ๋ ์นธ ๋ชจ๋ ๋น์ด์๋ ์ธ์ ํ ์นธ์ด 1๊ฐ์ด๊ณ , ํ์ ๋ฒํธ๋ 1์ด๋ค. ๋ฐ๋ผ์, 3๋ฒ ์กฐ๊ฑด์ ์ํด (1, 1)์ด 9๋ฒ ํ์์ ์๋ฆฌ๊ฐ ๋๋ค.
9 3 ย
ย 4 ย
ย ย ย
์ด๋ฒ์ ์๋ฆฌ๋ฅผ ์ ํ ํ์์ 8๋ฒ ํ์์ด๋ค. (2, 1)์ด 8๋ฒ ํ์์ด ์ข์ํ๋ ํ์๊ณผ ๊ฐ์ฅ ๋ง์ด ์ธ์ ํ ์นธ์ด๊ธฐ ๋๋ฌธ์, ์ฌ๊ธฐ๊ฐ ๊ทธ ํ์์ ์๋ฆฌ์ด๋ค.
9 3 ย
8 4 ย
ย ย ย
7๋ฒ ํ์์ ์๋ฆฌ๋ฅผ ์ ํด๋ณด์. 1๋ฒ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์นธ์ (1, 3), (2, 3), (3, 1), (3, 2)๋ก ์ด 4๊ฐ๊ฐ ์๊ณ , ๋น์ด์๋ ์นธ๊ณผ ๊ฐ์ฅ ๋ง์ด ์ธ์ ํ ์นธ์ (2, 3), (3, 2)์ด๋ค. ํ์ ๋ฒํธ๊ฐ ์์ (2, 3)์ด 7๋ฒ ํ์์ ์๋ฆฌ๊ฐ ๋๋ค.
9 3 ย
8 4 7
ย ย ย
์ด๋ฐ์์ผ๋ก ํ์์ ์๋ฆฌ๋ฅผ ๋ชจ๋ ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
9 3 2
8 4 7
5 6 1
์ด์ ํ์์ ๋ง์กฑ๋๋ฅผ ๊ตฌํด์ผ ํ๋ค. ํ์์ ๋ง์กฑ๋๋ ์๋ฆฌ ๋ฐฐ์น๊ฐ ๋ชจ๋ ๋๋ ํ์ ๊ตฌํ ์ ์๋ค. ํ์์ ๋ง์กฑ๋๋ฅผ ๊ตฌํ๋ ค๋ฉด ๊ทธ ํ์๊ณผย ์ธ์ ํ ์นธ์ ์์ ์ข์ํ๋ ํ์์ ์๋ฅผ ๊ตฌํด์ผ ํ๋ค. ๊ทธ ๊ฐ์ด 0์ด๋ฉด ํ์์ ๋ง์กฑ๋๋ 0, 1์ด๋ฉด 1, 2์ด๋ฉด 10, 3์ด๋ฉด 100, 4์ด๋ฉด 1000์ด๋ค. ํ์์ ๋ง์กฑ๋์ ์ด ํฉ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N2๊ฐ์ ์ค์ ํ์์ ๋ฒํธ์ ๊ทธ ํ์์ด ์ข์ํ๋ ํ์ 4๋ช ์ ๋ฒํธ๊ฐ ํ ์ค์ ํ๋์ฉ ์ ์๋์ด ์๋ฆฌ๋ฅผ ์ ํ ย ์์๋๋ก ์ฃผ์ด์ง๋ค. ํ์์ ๋ฒํธ๋ ์ค๋ณต๋์ง ์์ผ๋ฉฐ, ์ด๋ค ํ์์ด ์ข์ํ๋ ํ์ 4๋ช ์ ๋ชจ๋ ๋ค๋ฅธ ํ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ํ์์ ๋ฒํธ, ์ข์ํ๋ ํ์์ ๋ฒํธ๋ N2๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ์ด๋ค ํ์์ด ์๊ธฐ ์์ ์ ์ข์ํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ์์ ๋ง์กฑ๋์ ์ด ํฉ์ ์ถ๋ ฅํ๋ค.
์ ํ
3 โค N โค 20
์์
์์ 1
์ ๋ ฅ
3
4 2 5 1 7
3 1 9 4 5
9 8 1 2 3
8 1 9 3 4
7 2 3 4 8
1 9 2 5 7
6 5 2 3 4
5 1 9 2 8
2 9 3 1 4
์ถ๋ ฅ
54
์์ 2
์ ๋ ฅ
3
4 2 5 1 7
2 1 9 4 5
5 8 1 4 3
1 2 9 3 4
7 2 3 4 8
9 8 4 5 7
6 5 2 3 4
8 4 9 2 1
3 9 2 1 4
์ถ๋ ฅ
1053
My Sol
def fill_order(n):
global mat, N
def check_like(n, i, j):
global mat, N, likes_arr
blank, ret = 0, 0
for di, dj in ((-1,0),(1,0),(0,-1),(0,1)):
si, sj = i+di, j+dj
if not (0<=si<N and 0<=sj<N): continue
if not mat[si][sj]: blank += 1
elif mat[si][sj] in likes_arr[n]: ret += 1
return ret, blank
ret = []
max_like_cnt = 0
for i in range(N):
for j in range(N):
if mat[i][j]: continue
check_like_ret, check_blank_ret = check_like(n, i, j)
if max_like_cnt > check_like_ret: continue
elif max_like_cnt == check_like_ret:
ret.append((i, j, check_blank_ret))
elif max_like_cnt < check_like_ret:
max_like_cnt = check_like_ret
ret = [(i, j, check_blank_ret)]
return ret
N = int(input())
likes_arr = [set() for _ in range(N**2+1)]
orders = []
for _ in range(N**2):
n, *likes = map(int, input().split())
orders.append(n)
likes_arr[n] = set(likes)
mat = [[0]*N for _ in range(N)]
for order in orders:
points = fill_order(order)
points.sort(key= lambda x: (-x[2], x[0], x[1]))
ai, aj, ablank = points[0]
mat[ai][aj] = order
def check_score(ki, kj):
global mat, N, likes_arr
n = mat[ki][kj]
match = 0
for di, dj in ((-1,0),(1,0),(0,-1),(0,1)):
si, sj = i+di, j+dj
if not (0<=si<N and 0<=sj<N): continue
if not mat[si][sj]: continue
if mat[si][sj] in likes_arr[n]: match += 1
return 10**(match-1) if match else 0
scores = 0
for i in range(N):
for j in range(N):
scores += check_score(i, j)
print(scores)
์ผ์ฑ SW์ญ๋ํ๊ฐ ๋๋น ๊ตฌํ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์๋ค. ๋จ๊ณ๋ณ๋ก ๋๋์ด์ ์ฒ์ฒํ ํ์ด๋ด๋ฉด ๋๋ค.
- ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ค. ์ด๋ ์ข์ํ๋ ์ฌ๋๋ค์ ๋ฒํธ๋ฅผ ์ ์ฅํ ๋ ํด์ ํ ์ด๋ธ์ ์ฑ์ง๋ก O(1)์ ์๊ฐ๋ณต์ก๋๋ก ์กฐํํ๊ธฐ ์ํด set์ ์ด์ฉํ๋ค.
fill_order
๋ผ๋ ํจ์๋ฅผ ๋๋๋ฐ, 2์ฐจ์ ๋ฐฐ์ด mat์ ์์ ํ์ํ์ฌ ๋งค ์นธ์ ์ํ์ข์ฐ๋ฅผ ํ์ธํ๋ค.- ํด๋น ํ์ ๋ฒํธ๊ฐ ์ข์ํ๋ ํ์ ๋ฒํธ set์ ์ํ์ข์ฐ์ ๊ฐ์ด ๊ฐ๊ฐ ์๋์ง ์ฒดํฌํ๋ค. ์ด๋ ์ต๋๊ฐ๋ณด๋ค ํ์ฌ ์กฐํ์ ํฌ๊ธฐ๊ฐ ๋ ํฌ๋ฉด ์ ์ฅํ๋ ๋ฐฐ์ด๊ณผ ์ต๋๊ฐ์ ๊ฐฑ์ ํ๋ค.
- 2์์๊ฐ ์ฃผ๋ณ์ ๋น์นธ์ด ๋ง์ ์์ด๋ฏ๋ก ์ํ์ข์ฐ๋ฅผ ์กฐํํ ๋ ๋น์นธ, ์ฆ 0์ธ ๊ฒฝ์ฐ blank๋ฅผ ๋์ด๊ณ , ์กฐํ๊ฐ ๋๋๋ฉด ํ๋ ฌ๊ณผ ํจ๊ป tuple๋ก ๋ฐํํ๋ค.
- 2์์๊ฐ ์ํ์ข์ฐ ๋น์นธ์ ๊ฐ์, 3์์๊ฐ ๊ฐ๊ฐ ํ๊ณผ ์ด์ด ์์ ์์ด๋ฏ๋ก lambda๋ฅผ ํ์ฉํด ํ ๋ฒ์ ๋ด๋ฆผ์ฐจ์, ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํ๋ค.
- ์ ๋ ฌ๋ ๋ฐฐ์ด์ ์ฒซ ์์์ ํ๋ ฌ๊ฐ์ด ํ์ฌ ํ์์ ๋ฒํธ๊ฐ ๋ค์ด๊ฐ mat์์์ ์์น์ด๋ค.
- ์ด๋ฅผ ์ด์ฉํด ๋ชจ๋ mat์ ์ฑ์ด๋ค.
- ๊ฐ๊ฐ์ mat์ ํ์ ๋ฒํธ๋ฅผ ๋ชจ๋ ์์ ํ์ํ๋ฉฐ ์ํ์ข์ฐ์ ๊ฐ๋ค์ ๊ฐ๊ฐ ์ข์ํ๋ ํ์ set์์ ์ฐพ๋๋ค. ๊ทธ ๊ฐ์์ ๋ฐ๋ฅธ ๊ฐ์ ๊ณ์ฐํ์ฌ ๋ฐํํ๋ค.
- ์ ์ญ์์ ์ด ๋ฐํ๊ฐ์ ๋ชจ๋ ๋์ ํ ๋ค, ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ