[BOJ][๐ก2][๋ฐฑ์ค#17825] ์ฃผ์ฌ์ ์ท๋์ด
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold II
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์ฃผ์ฌ์ ์ท๋์ด๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ํ์์ ํ๋ ๊ฒ์์ด๋ค.
์ฒ์์๋ ์์ ์นธ์ ๋ง 4๊ฐ๊ฐ ์๋ค. ๋ง์ ๊ฒ์ํ์ ๊ทธ๋ ค์ง ํ์ดํ์ ๋ฐฉํฅ๋๋ก๋ง ์ด๋ํ ์ ์๋ค. ๋ง์ด ํ๋์ ์นธ์์ ์ด๋์ ์์ํ๋ฉด ํ๋์ ํ์ดํ๋ฅผ ํ์ผ ํ๊ณ , ์ด๋ํ๋ ๋์ค์ด๊ฑฐ๋ ํ๋์์ด ์๋ ์นธ์์ ์ด๋์ ์์ํ๋ฉด ๋นจ๊ฐ์ ํ์ดํ๋ฅผ ํ์ผ ํ๋ค. ๋ง์ด ๋์ฐฉ ์นธ์ผ๋ก ์ด๋ํ๋ฉด ์ฃผ์ฌ์์ ๋์จ ์์ ๊ด๊ณ ์์ด ์ด๋์ ๋ง์น๋ค. ๊ฒ์์ 10๊ฐ์ ํด์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. ๋งค ํด๋ง๋ค 1๋ถํฐ 5๊น์ง ํ ๋ฉด์ ํ๋์ฉ ์ ํ์๋ 5๋ฉด์ฒด ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฌ๊ณ , ๋์ฐฉ ์นธ์ ์์ง ์์ ๋ง์ ํ๋ ๊ณจ๋ผ ์ฃผ์ฌ์์ ๋์จ ์๋งํผ ์ด๋์ํจ๋ค. ๋ง์ด ์ด๋์ ๋ง์น๋ ์นธ์ ๋ค๋ฅธ ๋ง์ด ์์ผ๋ฉด ๊ทธ ๋ง์ ๊ณ ๋ฅผ ์ ์๋ค. ๋จ, ์ด๋์ ๋ง์น๋ ์นธ์ด ๋์ฐฉ ์นธ์ด๋ฉด ๊ณ ๋ฅผ ์ ์๋ค. ๋ง์ด ์ด๋์ ๋ง์น ๋๋ง๋ค ์นธ์ ์ ํ์๋ ์๊ฐ ์ ์์ ์ถ๊ฐ๋๋ค.
์ฃผ์ฌ์์์ ๋์ฌ ์ 10๊ฐ๋ฅผ ๋ฏธ๋ฆฌ ์๊ณ ์์ ๋, ์ป์ ์ ์๋ ์ ์์ ์ต๋๊ฐ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ฃผ์ฌ์์์ ๋์ฌ ์ 10๊ฐ๊ฐ ์์๋๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ป์ ์ ์๋ ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
1 2 3 4 1 2 3 4 1 2
์ถ๋ ฅ
190
์์ 2
์ ๋ ฅ
1 1 1 1 1 1 1 1 1 1
์ถ๋ ฅ
133
์์ 3
์ ๋ ฅ
5 1 2 3 4 5 5 3 2 4
์ถ๋ ฅ
214
์์ 4
์ ๋ ฅ
5 5 5 5 5 5 5 5 5 5
์ถ๋ ฅ
130
My Sol
def main():
def make_vals():
vals = [0]*32
for i in range(21):
vals[i] = 2*i
vals[21], vals[22], vals[23] = 13, 16, 19
vals[24], vals[25] = 22, 24
vals[26], vals[27], vals[28] = 28, 27, 26
vals[29], vals[30], vals[31] = 25, 30, 35
return vals
def make_children():
children = {}
for n in range(20):
children[n] = n+1
for a, b in ((21, 23), (24, 25), (26, 28), (29, 31)):
for n in range(a, b):
children[n] = n+1
children[23] = children[25] = children[28] = 29
children[31] = 20
children[20] = -1
special_children = {5: 21, 10: 24, 15: 26}
return children, special_children
def move(move_cnt, acc, pos_list, pos_set):
def move_next(is_special, cur_max_acc):
ret = cur_max_acc
step_cnt = 1
cur_pos = special_children[p] if is_special else children[p]
if cur_pos != -1:
while step_cnt < cur_move:
cur_pos = children[cur_pos]
if cur_pos==-1: break
step_cnt += 1
new_pos_list = pos_list[:]
new_pos_list[pi] = cur_pos
new_pos_set = pos_set - {p}
if cur_pos==-1:
new_pos_list.pop(pi)
ret = max(ret, move(move_cnt+1, acc, new_pos_list, new_pos_set))
else:
if cur_pos in pos_set: return 0
ret = max(ret, move(move_cnt+1, acc+vals[cur_pos], new_pos_list, new_pos_set|{cur_pos}))
return ret
if move_cnt==10: return acc
cur_max_acc = acc
cur_move = moves[move_cnt]
for pi in range(len(pos_list)):
p = pos_list[pi]
is_special = p in special_children_set
cur_max_acc = max(cur_max_acc, move_next(is_special, cur_max_acc))
return cur_max_acc
moves = list(map(int, input().split()))
vals = make_vals()
children, special_children = make_children()
special_children_set = {5, 10, 15}
return move(0, 0, [0, 0, 0, 0], {0})
print(main())
์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ ์จ์ผํ๋ ๊ฐ์ด ์ ์๋๋ฐ ์ฌ์ค์ ์ฉ๋ ธ๊ฐ๋ค ๊ตฌํ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค. DFS๋ฅผ ํ์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- ์ท๋์ดํ๊ณผ ๊ท์น์ ํธ๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉํด ์์์ ๋ฐ๋ผ๋ณด๋๋ก ํ๋ค. ๊ฐ ์์ฒด๋ฅผ ๋ฒํธ๋ก ํ๊ธฐ์๋ ์๋ก ๋ค๋ฅธ ๊ฒฝ๋ก์ ๊ฐ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๋ ์์ด์ ๊ฐ ๋
ธ๋์ ๋ฒํธ๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ํด๋น ๋
ธ๋์ ๋ฒํธ๊ฐ ๊ฐ์ง๋ ๊ฐ์ ๋ฐ๋ก ์ง์ ํด์ฃผ์๋ค. ์ด๋ฅผ ๊ฐ๊ฐ
make_children
๊ณผmake_vals
ํจ์๋ฅผ ํตํด ๋ถ๋ฆฌํด์ ๊ตฌํํ๋ค. - DFS ํจ์
move
๋ฅผ ์์ํ๋ค. parameter๋ก๋ ์ด๋ ํ์๋ฅผ ์๋ฏธํ๋move_cnt
, ๋์ ๊ฐ์ธacc
, ๋ง๋ค์ ์์น ์ ๋ณด ๋ฆฌ์คํธpos_list
, ์์น ์ ๋ณด setpos_set
์ด๋ค. - ํ์ฌ ์ด๋ํ ์ ์๋ ์คํ
์๋ฅผ
cur_move
๋ก ๋์๋ค. ์ด๋ ํ์ฌ ์ด๋ ํ์move_cnt
๋ฅผ ์ด๋์คํ ๋ฐฐ์ดmoves
์ ์ธ๋ฑ์ค๋ก ํ์ฌ ๊ตฌํ๋ค. - ๊ฐ ๋ง๋ค์ ์ ๋ณด์ธ
pos_list
์ ๊ฐ ๋ง๋ค์ ์์ง์ธ๋ค๊ณ ๊ฐ์ ํ๋ค. ๋ง์ฝ ํ๋์ ์์น์ ์์ด์ ๋ ๋น ๋ฅด๊ฒ ์ด๋ํ ์ ์๋ ๊ฒฝ์ฐ๋ผ๋ฉดspecial
ํ๋ค๊ณ ํ๋ค. ์ด๋ฏธfind_children
ํจ์์์ specialํ ๊ฒฝ์ฐ์ ์์น์ children ์ ๋ณด๋ฅผ ๊ตฌํด๋์๋ค. - ํ์ฌ ๋ง์ ์์น๊ฐ
special
ํ ์์น์ ์๋์ง, ์๋์ง์ ๋ฐ๋ผ์ ์ด๋ children์ด ๋ฌ๋ผ์ง๋ฏ๋ก ์ด๋ฅผ ํ์ธํ๋ค.move_next
ํจ์์์ ๋ค์์ ์งํํ๋ค. move_next
ํจ์๋ ์ด๋ ์คํ ํ์๋งํผ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ ์ด๋ํ์ฌ ๋์ฐฉ ์ง์ ์ ๊ณ์ฐํ๋ค. ์ด๊ฒ์ด ๊ฐ์ด 40์ธ 20๋ฒ ๋ ธ๋๋ฅผ ๋๋๋ค๋ฉด ๋์ฐฉ ์ง์ ์ ๋์ฐฉํ ๊ฒ์ด๋ค. ๋์ฐฉ์ง์ ์ ๋ฒํธ๋ฅผ -1๋ก ์ค์ ํ๋ค.- ๋ชจ๋ ์ด๋์ ๋ง์น๊ณ ํ์ฌ ์์น๊ฐ -1์ด๋ผ๋ฉด ์ด๋ํ ์ ์๋ ๋ง์ด ๋๊ธฐ ๋๋ฌธ์
new_pos_list
์์ ๋นผ์ค๋ค. - ๋ง์ฝ ๋์ฐฉ์ ์ด -1์ด ์๋๋ผ๋ฉด, ์ด๋ฏธ ๊ทธ๊ณณ์ ๋ง์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค. ์ด๊ฒ์
pos_set
์ ํตํด ์ ์ ์๋ค. ๋ง์ฝ ์๋ค๋ฉด ๋ฌด์๋ฏธํ ์ด๋์ด๋ฏ๋ก ํ์ฌret
์ ๋ฐํํ๋ค. ์ด์ฐจํผmax
ํจ์์์ ๋ฌด์๋ฏธํ๊ฒ ์ฒ๋ฆฌ๋๋ค. - ๋ง์ฝ ํ ์์น๊ฐ ๋์ฐฉ์ ์ด ์๋๋ฉฐ ๋ง์ด ์๋ค๋ฉด ํ ์์น๋ฅผ
pos_list
์pos_set
์ ์๋ก ์๊ธดnew_pos_list
์new_pos_set
์ ๋ค์ parameters๋ก ํ์ฌmove
ํจ์๋ฅผ ์ฌ๊ฐํ๋ค. ์ด๋ ํ์ฌ ์์น์ ๊ฐ์ ๋์ ๊ฐ์ ๋ํ๊ณ , ์ด๋ํ์๋ฅผ 1 ๋๋ ค์ฃผ๋๋ก ํ๋ค. move_cnt
๊ฐ 10์ด ๋๋ฉด ์ด ์์ ์acc
๋ฅผ ๋ฐํํ๋ค. ๋ชจ๋ ์ด๋์ ์ข ์ ์ ์ฐ์ ๊ฒฐ๊ณผ๋ค์ ์ต๋๊ฐ์ ๋ค์ ์์๋ก ์ฌ๋ฆฌ๋ฏ๋กmain
์์๋ ์ด ํจ์์ ์์์ ์ ๋ฐํ๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
# empty
๋๊ธ๋จ๊ธฐ๊ธฐ