[BOJ][๐ก5][๋ฐฑ์ค#03980] ์ ๋ฐ ๋ช ๋จ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์ฑํผ์ธ์ค ๋ฆฌ๊ทธ ๊ฒฐ์น์ ์ ์๋๊ณ ์๋ ๋งจ์ฒด์คํฐ ์ ๋์ดํฐ๋์ ๋ช ์ฅ ํผ๊ฑฐ์จ ๊ฐ๋ ์ ์ด๋ฒ ๊ฒฝ๊ธฐ์ 4-4-2 ๋ค์ด์๋ชฌ๋ ์ ์ ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค. ์ค๋ ๊ฒฐ์น์ ์ ๋ธ ์ ๋ฐ ์ ์ 11๋ช ์ ๋ฏธ๋ฆฌ ๊ณจ๋ผ๋์์ง๋ง, ์ด๋ค ์ ์๋ฅผ ์ด๋ ํฌ์ง์ ์ ๋ฐฐ์นํด์ผ ํ ์ง ์์ง ๊ฒฐ์ ํ์ง ๋ชปํ๋ค. ์์์ฝ์น ๋ง์ดํฌ ํ ๋์ 11๋ช ์ ์ ์๊ฐ ๊ฐ๊ฐ์ ํฌ์ง์ ์์์ ๋ฅ๋ ฅ์ 0๋ถํฐ 100๊น์ง์ ์ ์๋ก ์์นํ ํ๋ค. 0์ ๊ทธ ์ ์๊ฐ ๊ทธ ํฌ์ง์ ์ ์ ํฉํ์ง ์๋ค๋ ๋ป์ด๋ค. ์ด๋, ๋ชจ๋ ์ ์์ ํฌ์ง์ ์ ์ ํ๋ย ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ชจ๋ ํฌ์ง์ ์ ์ ์๋ฅผ ๋ฐฐ์นํด์ผ ํ๊ณ , ๊ฐ ์ ์๋ ๋ฅ๋ ฅ์น๊ฐ 0์ธ ํฌ์ง์ ์ ๋ฐฐ์น๋ ์ ์๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฌ๋ฌ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฒซ์งธ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ C๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์ผ์ด์ค๋ 11์ค๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , i๋ฒ ์ค์ 0๊ณผ 100์ฌ์ด์ 11๊ฐ์ ์ ์ sij๋ฅผ ํฌํจํ๊ณ ์๋ค. sij๋ i๋ฒ์ ์๊ฐ j๋ฒ ํฌ์ง์ ์์ ๋ธ ๋์ ๋ฅ๋ ฅ์ด๋ค. ๋ชจ๋ ์ ์์๊ฒ ์ ํฉํ ํฌ์ง์ ์ ์๋ ์ต๋ 5๊ฐ์ด๋ค. (๋ฅ๋ ฅ์น๊ฐ 0๋ณด๋ค ํฌ๋ค)
์ถ๋ ฅ
๊ฐ๊ฐ์ ํ ์คํธ ์ผ์ด์ค์ ๋ํด์, ๋ชจ๋ ํฌ์ง์ ์ ์ ์๋ฅผ ์ฑ์ ์ ๋, ๋ฅ๋ ฅ์น์ ํฉ์ ์ต๋๊ฐ์ ํ ์ค์ ํ๋์ฉ ์ถ๋ ฅํ๋ค. ํญ์ ํ๋ ์ด์์ ์ฌ๋ฐ๋ฅธ ๋ผ์ธ์ ์ ๋ง๋ค ์ ์๋ค.
์์
์ ๋ ฅ
1
100 0 0 0 0 0 0 0 0 0 0
0 80 70 70 60 0 0 0 0 0 0
0 40 90 90 40 0 0 0 0 0 0
0 40 85 85 33 0 0 0 0 0 0
0 70 60 60 85 0 0 0 0 0 0
0 0 0 0 0 95 70 60 60 0 0
0 45 0 0 0 80 90 50 70 0 0
0 0 0 0 0 40 90 90 40 70 0
0 0 0 0 0 0 50 70 85 50 0
0 0 0 0 0 0 66 60 0 80 80
0 0 0 0 0 0 50 50 0 90 88
์ถ๋ ฅ
970
My Sol
import sys; input = sys.stdin.readline
def calc(pos):
global visited_pos, visited_per
global pools, max_score, total
if pos==11:
if sum(visited_pos)==11 and max_score < total:
max_score = total
return
# ํด๋น ํฌ์ง์
์ ๋ด๋นํ ์ฌ๋์ด ์๋ค๋ฉด ๋ค์ ํฌ์ง์
if visited_pos[pos]:
calc(pos+1)
else:
pool = pools[pos]
for per, score in pool:
if not visited_per[per]:
visited_per[per] = 1
visited_pos[pos] = 1
total += score
calc(pos+1)
visited_per[per] = 0
visited_pos[pos] = 0
total -= score
T = int(input())
for _ in range(T):
# mat ์ ์
mat = [list(map(int, input().split())) for _ in range(11)]
# pools ์ ์
pools = [[] for _ in range(11)]
for per, lst in enumerate(mat):
for pos, score in enumerate(lst):
if score:
pools[pos].append((per, score))
# ํด๋น ํฌ์ง์
๊ฐ๋ฅํ ์ ์ผํ ์ฌ๋ ์ฐพ์ ์ฑ์ฐ๊ธฐ
visited_pos = [0]*11
visited_per = [0]*11
total = 0
max_score = 0
for pos in range(11):
if len(pools[pos]) == 1:
per, score = pools[pos][0]
visited_per[per] = 1
visited_pos[pos] = 1
total += score
calc(0)
print(max_score)
์ ๋ ฅ ์ฒ๋ฆฌ์ ๋ณ์
์ฌ๋ฌ ์กฐํฉ๊ณผ ์ฌ๊ทํจ์๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค. ์ฐ์ ์ ๋ ฅ์ผ๋ก ๋ค์ด์ค๋ ์ ์(per)๋ค์ ํฌ์ง์ (pos)๊ณผ ๊ฐ ํฌ์ง์ ์ ์ ์(score)์ mat 2์ฐจ์ ๋ฐฐ์ด์ ์ฒ๋ฆฌํ์ฌ ์ ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ๊ฐ์์ ์ ์, ํฌ์ง์ , ์ ์ ์ ๋ณด๋ฅผ ๋ด๋ pools 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ ๋ค.
mat์ ๊ฐ ํ์ด person, ๊ฐ ์ด์ด position์ด๋ฏ๋ก, mat์ enumerateํ์ฌ ๊ฐ ํ, per๋ง๋ค lst๋ฅผ ๋ฐ์๊ณ , ๊ทธ ๋ด๋ถ์ lst๋ฅผ ๋ค์ enumerateํ์ฌ pos์ score ์ ์๋ก ์ ์ํ์๋ค. ๊ทธ๋ฆฌ๊ณ score๊ฐ 0์ด ์๋๋ผ๋ฉด ํด๋น pos์ per, score์ pools[pos]์ ๋ฆฌ์คํธ ๋ด์ (per, score) tuple๋ก ์ ์ฅํ๋ค.
๋์ฒด ๋ถ๊ฐ๋ฅํ ํฌ์ง์ ์ ๋ณ
๋จผ์ ๋์ฒด ๋ถ๊ฐ๋ฅํ ์ฌ๋๋ค์ ํฌ์ง์ ์ ์ฑ์์ผ ํ๋ค. ํ ํฌ์ง์ ์ ๋ํ ์ฌ๋ฌ ํ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง depth๋ฅผ ๋๋ ค๊ฐ๋ฉฐ ํ์ธํ๋ฉด ๋๋ ์ผ์ด๊ธฐ ๋๋ฌธ์ 0๋ถํฐ 10๊น์ง์ ์์ ๋ํ์ฌ pools[pos]๊ฐ 1์ธ ํฌ์ง์ ์ ์ฐพ๋๋ค. pools[pos]๋ ๊ณง, ํด๋น ํฌ์ง์ ์ ์ํํ ์ ์๋ ์ ์๋ค์ ๋ฒํธ์ ๋ฅ๋ ฅ์น์ด๊ธฐ ๋๋ฌธ์ด๊ณ , ์ด๊ฒ์ด 1์ด๋ผ๋ ๊ฒ์ ํ ์ฌ๋๋ง ํด๋น ํฌ์ง์ ์ ์ํํ ์ ์๋ค๋ ๋ง์ด๋ค.
์ฌ๊ทํจ์ ๋ด์์ ํ๋ณ์ ์ํ visited_per๊ณผ visited_pos๋ฅผ 11๊ฐ์ 0์ด ์๋ ๋ฆฌ์คํธ๋ก ์ด๊ธฐํํ๊ณ , ์ด๋ฅผ per๊ณผ pos๋ฅผ ์ธ๋ฑ์ค๋ก ํ์ฌ ๊ฐ๊ฐ 1๋ก ์ฒดํฌํด์ค๋ค. ํ์ ์ด๊ฒ์ด 1์ด๋ผ๋ฉด ์ด ์๋ฆฌ์ ํ๋ณด๋ฅผ ๋ฃ์ง ์๊ณ ์ง๋์น ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ์ธ total์ score์ ๋ฃ์ด์ฃผ๋ฉด ํ ํฌ์ง์ ์ ํ ์ ์๋ง ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ๋ํ ์ด๊ธฐ ๊ณ์ฐ์ ๋ง์น ์ ์๋ค.
calc ํจ์ 1: ์ข ๋ฃ์กฐ๊ฑด
PS๋ฅผ ์ํ ํจ์์ด๋ฏ๋ก ๋ ๋ค ์ ์ญ๋ณ์๋ฅผ ์ฐ๊ธฐ ์ํด global์ ๋๋ ค๋ฃ์๋ค. ์ ๋ฌ์ธ์๋ pos๋ก, 0๋ถํฐ ์์ํด ๊ณ์ฐํ๋ฉฐ 10๊น์ง์ ๊ณ์ฐ์ ์ง๋ 11์ ๋ค๋ค๋ฅด๋ฉด ๋๋์๊ฐ์ผ ํ๋ค. ์ด๋ sum(visited_pos)==11, ์ฆ ๋ชจ๋ ํฌ์ง์ ์ ์ ์๊ฐ ์์นํ๊ณ , ํ์ฌ๊น์ง ์ต๊ณ ์ ์๋ณด๋ค ์ง๊ธ์ ๋ฐฐ์น๊ฐ ๋ ํฐ ๋์ ์ ์๋ฅผ ๊ฐ์ง๋ค๋ฉด ์ด๋ฅผ ์ต๊ณ ์ ์๋ก ๊ฐฑ์ ํ๊ณ ๋๋์๊ฐ๋ค.
calc ํจ์ 2: ํด๋น ํฌ์ง์ ์ ์ฌ๋์ด ์๋ค๋ฉด?
ํด๋น ํฌ์ง์ ์ ์ ์๊ฐ ์๋ค๋ฉด for๋ฌธ์ ๋ ํ์๋ ์์ด ๋ค์ pos๋ก ๋์ด๊ฐ์ฃผ๋ฉด ๋๊ฒ ๋ค.
calc ํจ์ 3: ์ฌ๊ท ์กฐ๊ฑด ์ ์
pools์ pos์ธ๋ฑ์ค์ ๋ฆฌ์คํธ๋ฅผ pool๋ก ๋๋ค. ์ด pool์ ํญ๋ชฉ์ tuple๋ค์ธ๋ฐ, ๊ฐ๊ฐ์ด ํด๋น pos์์ ๊ฐ์ฉํ ์ ์๋ค์ ๋ฒํธ์ธ per๊ณผ score์ ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. ์ด์ ๊ณผ์ ์์ ์ ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด visited_per[per]==1์ผ ๊ฒ์ด๊ณ , ์ด๋ฐ ๊ฒฝ์ฐ ๋ค์ tuple๋ก ๋์ด๊ฐ์ผ ํ๋ค. ์ด๋ฅผ ์ํ ์กฐ๊ฑด๋ฌธ์ ๊ฑธ๊ณ , visited_per[per]์ด 0์ธ ๊ฒฝ์ฐ์ ํ์ ์ฝ๋๋ฅผ ์งํํ๋ค.
์ฒ์์ผ๋ก ๋ง๋ visited_per[per]==0์ธ per๊ณผ score์ ๋ํ์ฌ ํด๋น per์ pos์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ๋ฌ๋ฉด visited๋ per๊ณผ pos์ ๋ํ์ฌ ๋ชจ๋ 1๋ก ์ฒดํฌํด์ฃผ๊ณ , ๋์ ์ ์์ธ total์ score์ ๋ํด ๋ค์ pos๋ก ๋์ด๊ฐ๋ฉด ๋๊ฒ ๋ค.
๋ชจ๋ pos๋ฅผ ์ฐ์ด max_score์ total์ ๋น๊ตํด ๊ฐฑ์ ํ๊ณ ๋์์ค๋ฉด visited๋ฅผ 0์ผ๋ก ์ฒดํฌํด์ ํ๊ณ total์์ score์ ๋นผ์ค ๋ค ๋ค์ pool์ ๋ํ์ฌ ๋ ์กฐํ๋ฅผ ์งํํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
from sys import stdin
T = int(stdin.readline())
ans = 0
def solve(idx,count):
if idx == 11:
global ans
ans = max(ans,count)
return
for i in range(11):
if players[idx][i]!= 0 and not visit[i]:
visit[i]=True
solve(idx+1,count+players[idx][i])
visit[i]=False
for _ in range(T):
ans = 0
players = [list(map(int,stdin.readline().split())) for _ in range(11)]
visit = [False]*11
solve(0,0)
print(ans)
๊ธธ์ด๊ฐ ์งง์ผ๋ฉด์๋ ์ฐ์ฐ์๋๊ฐ ์ข์๋ ๋ฌธ์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ๋ค.
๋๋ ์ด๋ฐ์ ํฌ์ง์ ์ ํผ์ ์ํํ ์ ์๋ ์ฌ๋์ ์ ๋ณํด์ ์ ๊ฑฐํ์๊ธฐ ๋๋ฌธ์ visited์ ๋ํด์ per๊ณผ pos๊ฐ ๋ชจ๋ ํ์ํ๋๋ฐ, ์ด ๋ถ์ ํ์ด๋ per์ ๋ํด์๋ง ์กฐํํ๋ค. ์๋ํ๋ฉด pos์ ์๋ฏธ์ธ idx๋ 0๋ถํฐ ์์ํด์ 10๊น์ง ์์ฐจ์ ์ผ๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋ฌธ์ ์ ์์ ๋ํ visit๋ง ์ฒดํฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฒฐํ๋ค.
๋ํ ๋๋ 0์ ์ ์ธํ๊ณ score๊ฐ ์๋ ์นธ์ pos์ per์ tuple๋ก ํด์ ๋ฆฌ์คํธ์ ๋ณ๋๋ก ๋ด๊ณ ์ด ๊ฐ๊ฐ๋ง ์กฐํํ๋๋ฐ, ์ด ๋ถ์ ๋ฌด์ฐจ๋ณ์ ์ผ๋ก 0๋ถํฐ 10๊น์ง ๋ชจ๋ depth์์ ์กฐํํด์ โ0์ด๋ฉด ๋ง๊ณ โ ํ๋ ๋ธ๋ฃจํธํฌ์ค ๋ฐฉ์์ ์ฌ์ฉํ์๋ค. ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ์๋ค. ์ด๊ฒ์ด ๋ฌด์์ ์ข๋ค๊ธฐ์ ๋ด ํ์ด์ ์ฐ์ฐ ์๊ฐ์ด ์ฝ 7~8% ์ ๋ ๋ ๋นจ๋๋๋ฐ, depth๊ฐ ๊น์ด์ง์๋ก ์ด๋ฌํ ๋ฌด์ฐจ๋ณ ๊ฒ์ ๋ฐฉ์์ ๋ํ ์ฐ์ฐ ์๊ฐ ์ฆ๊ฐ๊ฐ ์ํฅ์ ์ค ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
๊ทธ๋ฆฌ๊ณ ์๊ณ ๋ฆฌ์ฆ ํ์ด์๋ง ๊ฐํ์ ์๊ฐํ์ง ๋ชปํ๋๋ฐ max(a, b) ํจ์๋ฅผ ์ฌ์ฉํด์ depth๊ฐ 11์ธ ๊ฒฝ์ฐ์ ์์ฝ๊ฒ ๋น๊ตํด์ ๊ฐฑ์ ํ์๋ค. ์ maxํจ์ ์๊ฐ์ ๋ชปํ์งใ ใ
๋๊ธ๋จ๊ธฐ๊ธฐ