์์์ ํ ๋
ธ๋์์ ์์ํด์ ๋ค์ ๋ถ๊ธฐ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ
#์ฌ๊ท #์ํ #๋ฌดํ๋ฃจํํ์ถ #Back-Tracking
์ฌ์ค DFS์๊ณ ๋ฆฌ์ฆ์ ์ด ๋ฌธ์ ๋ก ์ฒ์ ์ ํ๋๋ฐ ์ด์ ์ผ ์ ๋ฆฌ๊ฐ ๋์ด ํฌ์คํ ํ๋ค.
์ฐ์ n,a(์์ด),f(์ฐ์ฐ์)๋ฅผ ์ ์ฅํ๊ณ , dfs()
ํจ์๋ฅผ ๊ตฌํํ์
dfs()
ํจ์๋ ๋ชจ๋ ์ฐ์ฐ์๋ค์ ๋ชจ๋ ๋ค ๋ฐฉ๋ฌธํ์ฌ ๊ฐ์ ์ ์ฅํ๊ณ ,
์ต๋๊ฐ ์ต์๊ฐ์ max, minํจ์๋ก ์ ์ฅํ์ฌ ์ถ๋ ฅํ์
dfs()
ํจ์๋ฅผ ๊ตฌํํ์import sys
input = sys.stdin.readline
maxR = -1e9 #์ต๋๊ฐ ์ ์ฅ์ฉ
minR = 1e9 #์ต์๊ฐ ์ ์ฅ์ฉ
def dfs(idx, res, sum, sub, mul, div):
global maxR, minR
if idx == n:
maxR = max(res, maxR)
minR = min(res, minR)
return
if sum:
dfs(idx+1, res+a[idx], sum-1, sub, mul, div)
if sub:
dfs(idx+1, res-a[idx], sum, sub-1, mul, div)
if mul:
dfs(idx+1, res*a[idx], sum, sub, mul-1, div)
if div:
dfs(idx+1, int(res/a[idx]), sum, sub, mul, div-1)
n = int(input().rstrip())
a = list(map(int, input().split()))
f = list(map(int, input().split()))
dfs(1, a[0], f[0], f[1], f[2], f[3])
print(maxR)
print(minR)
import sys
input = sys.stdin.readline
maxR = -1e9
minR = 1e9
#res๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ์ฃผ๊ณ ๋ฐ์ผ๋ฉด์ maxR, minR์ ๊ฐ ์ ์ฅํ๋ ๊ฒ์ด ๋ชฉํ
def dfs(idx, res, sum, sub, mul, div):
global maxR, minR
if idx == n: #๋ชจ๋ ์๋ฅผ ๋ค ๋ฐฉ๋ฌธ ์ res๋ฅผ minR, maxR์ ๊ฐ๊ฐ ์ ์ฅ (ํ์ถ)
maxR = max(res, maxR)
minR = min(res, minR)
return
if sum:
dfs(idx+1, res+a[idx], sum-1, sub, mul, div)
if sub:
dfs(idx+1, res-a[idx], sum, sub-1, mul, div)
if mul:
dfs(idx+1, res*a[idx], sum, sub, mul-1, div)
if div:
dfs(idx+1, int(res/a[idx]), sum, sub, mul, div-1)
n = int(input().rstrip())
a = list(map(int, input().split()))
f = list(map(int, input().split()))
dfs(1, a[0], f[0], f[1], f[2], f[3])
print(maxR)
print(minR)
ex)
n = 6
a = 1 2 3 4 5 6
f = 2 1 1 1
def dfs(idx, res, sum, sub, mul, div):
global maxR, minR
if idx == n:
maxR = max(res, maxR)
minR = min(res, minR)
return
if sum:
dfs(idx+1, res+a[idx], sum-1, sub, mul, div)
if sub:
dfs(idx+1, res-a[idx], sum, sub-1, mul, div)
if mul:
dfs(idx+1, res*a[idx], sum, sub, mul-1, div)
if div:
dfs(idx+1, int(res/a[idx]), sum, sub, mul, div-1)
์ ์ : def dfs(idx, res, sum, sub, mul, div):
ํธ์ถ : dfs(1, a[0], f[0], f[1], f[2], f[3])
์ฆ, dfs(1, 1, 2, 1, 1, 1)
1. ์ฐ์ idx๊ฐ์ 1๋ก ๋๊ธฐ๊ณ , dfs()๊ฐ ํธ์ถ๋ ๋๋ง๋ค ํ๋ผ๋ฏธํฐ๋ก "idx+1"๊ฐ์ ๋๊ธด๋ค.
(idx++์ํค๋ฉด์ "idx == n" ๋ ์ข
๋ฃ์ํฌ๊บผ๋๊น!)
2. res๊ฐ์ผ๋ก a[0]๋ฅผ ๋๊ธฐ๊ณ , dfs()๊ฐ ํธ์ถ๋ ๋๋ง๋ค res์ ์ฐ์ฐ์๋ง๋ค์ ๊ณ์ฐ์ ํด์ค๋ค.
(a[0]์ผ ๋ ์ฐ์ฐ์๊ฐ +๋ฉด, ํ๋ผ๋ฏธํฐ๋ก a[0]+a[idx]ํด์ฃผ๋๋ฐ
์ด ๋ idx=idx+1์ด๋ฏ๋ก, res์ ํ๋ผ๋ฏธํฐ๋ก "a[0]+a[1]"๋ฅผ ๋๊ธฐ๊ฒ ๋๋ค.
๊ทธ ๋ค์ ํธ์ถ์ res+a[2], ๊ทธ๋ค์์ res+a[3] ..... )
3. 3๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ถํฐ๋ ์ฐ์ฐ์๋ฅผ +, -, *, / ์์ผ๋ก ๋ฐ๋๋ค.
๋๋ ์ด ๋ถ๋ถ์ด ์ฐธ ํท๊ฐ๋ ธ๋๋ฐ, ์ด๊ฒ DFS์๊ณ ๋ฆฌ์ฆ์ ์ ์ ๊ฐ๋
์ ์ดํดํ๊ธฐ ์ข๋ค!
n = 6
a = 1 2 3 4 5 6
f = 2 1 1 1
๐๐ปdfs(1, 1+2, 1, 1, 1, 1) sum๋์:a[0]+a[1] res = 3
๐๐ปdfs(2, 3+3, 0, 1, 1, 1) sum๋์:res+a[2] res = 6
๐๐ปdfs(3, 6-4, 0, 0, 1, 1) sub๋์:res-a[3] res = 2
๐๐ปdfs(4, 2*5, 0, 0, 0, 1) mul๋์:res*a[4] res = 10
๐๐ปdfs(5, 10/6, 0, 0, 0, 0) div๋์:res-a[5] res = 1
๐๐ปidx == n์ด๋ฏ๋ก res๊ฐ minR, maxR์ ์ ์ฅ
๋จ, ์ด๊ฒ ์ฒซ ๋ฒ์งธ ๋์์ด๋ผ๋ ์ ์ด๋ค!
div๊น์ง ๋์ํ dfs()๊ฐ "return"๊ฐ์ ์ด๋๋ก ์ ๋ฌ๋ ๊น?
๐๐ป๋ฐ๋ก, div ์ด์ ์ mul์ dfs(4, 2*5, 0, 0, 0, 1) ๋ก ๋์จ๋ค!
๐๐ป๊ทธ ํ, mul ์ด์ ์ sub์ dfs(3, 6-4, 0, 0, 1, 1) ๋ก ๋์ค๊ฒ ๋๋๋ฐ
์ฌ๊ธฐ์ if mul:์ ํ์ถํ ์ํฉ์ด๋ฏ๋ก, if div:๋ฅผ ๋ฐฉ๋ฌธํ๊ฒ ๋์ด
dfs(4, 2/5, 0, 0, 1, 0) div ๋จผ์ ๋์ํ์ฌ res = 0์ด ๋๊ณ
dfs(5, 0*6, 0, 0, 0, 0) mul์ด ๋์ํ์ฌ res = 0์ด ๋์ด return๋๋ค.
๐๐ป๊ทธ ํ, sub ์ด์ ์ sum์ dfs(2, 3+3, 0, 1, 1, 1) ๋ก ๋์ค๊ฒ ๋๋๋ฐ,
์ฌ๊ธฐ์ ๋ if sub:๋ฅผ ํ์ถํ ์ํฉ์ด๋ฏ๋ก if mul:์ ๋ฐฉ๋ฌธํ๊ฒ ๋์ด,
๊ณฑํ๊ธฐ > ๋๋๊ธฐ > ๋นผ๊ธฐ ์์ผ๋ก ์งํํ๊ฒ ๋๋ค.
์ด๋ฐ์์ผ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฐฉ๋ฌธํ์ฌ idx == n์ผ ๋๋ง๋ค max์ minํจ์๋ฅผ ํตํด
maxR, minR์ ๋์ถํด๋ด๋ ๊ฒ์ด ์ด ๋ฌธ์ ์ ํต์ฌ์ด๋ค.
dfs()
๋ฅผ ์ฌ๊ทํจ์ ํํ๋ก ๋ง๋ค์๋ค๋ฉด ํจ์๋ด๋ถ์์ return ํ ์ด๋ป๊ฒ ๋์ํ๋์ง