์•Œ๊ณ ๋ฆฌ์ฆ˜/DP

[๋ฐฑ์ค€ 3687 ๐Ÿฅ‡] ์„ฑ๋ƒฅ๊ฐœ๋น„

1eehyunji 2023. 8. 18. 23:41

๋ฌธ์ œ

์„ฑ๋ƒฅ๊ฐœ๋น„๋Š” ์ˆซ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ์— ์•„์ฃผ ์ด์ƒ์ ์ธ ๋„๊ตฌ์ด๋‹ค. ๋ณดํ†ต ์‹ญ์ง„์ˆ˜๋ฅผ ์„ฑ๋ƒฅ๊ฐœ๋น„๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์„ฑ๋ƒฅ๊ฐœ๋น„์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์„ฑ๋ƒฅ๊ฐœ๋น„๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์™€ ํฐ ์ˆ˜๋ฅผ ์ฐพ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์ตœ๋Œ€ 100๊ฐœ ์ด๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ•œ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์„ฑ๋ƒฅ๊ฐœ๋น„์˜ ๊ฐœ์ˆ˜ n์ด ์ฃผ์–ด์ง„๋‹ค. (2 ≤ n ≤ 100)

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์„ฑ๋ƒฅ๊ฐœ๋น„๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์™€ ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋‘ ์ˆซ์ž๋Š” ๋ชจ๋‘ ์–‘์ˆ˜์ด์–ด์•ผ ํ•˜๊ณ , ์ˆซ์ž๋Š” 0์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†๋‹ค. 

๋ฌธ์ œ ํ’€์ด

import sys

t=int(sys.stdin.readline())
# ์„ฑ๋ƒฅ๊ฐœ๋น„ ๊ฐœ์ˆ˜๋ณ„๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜
# 2~7
# numbers=['','','1','7','4','2','0','8']
numbers=[0,0,1,7,4,2,0,8]
# ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
#dp=['9999999999999999999']*(101)
dp=[sys.maxsize]*(101)
# dp init
for i in range(2,8):
    if i==6:
        # dp[i]='6'
        dp[i]=6
    else:
        dp[i]=numbers[i]
for idx in range(8,101):
    for j in range(2,8):
        # if int(dp[idx])>int(dp[idx-j]+numbers[j]):
            # dp[idx]=dp[idx-j]+numbers[j]
        dp[idx]=min(dp[idx], dp[idx-j]*10+numbers[j])

for _ in range(t):
    num=int(sys.stdin.readline())
    # ๊ฐ€์žฅ ํฐ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
    largest=''
    # ํ™€์ˆ˜์ผ ๊ฒฝ์šฐ
    if num%2==1:
        largest+='7'
        largest+='1'*(num//2-1)
    else:
        # ์ง์ˆ˜์ผ ๊ฒฝ์šฐ
        largest+='1'*(num//2)
    smallest=dp[num]
    print(smallest, largest)
  • Greedy์™€ DP๋ฅผ ํ•ฉ์ณ๋†“์€ ๋ฌธ์ œ์˜€๋‹ค.
  • ๋จผ์ € n๊ฐœ์˜ ์„ฑ๋ƒฅ๊ฐœ๋น„๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ“๊ฐ’์€ ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ธฐ ์‰ฝ๋‹ค. ๋‹จ์ˆœํžˆ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜์˜ ์ž๋ฆฟ์ˆ˜๋ฅผ ์ œ์ผ ๊ธธ๊ฒŒ ๋Š˜๋ ค์ฃผ๋ฉด ํ•ด๋‹น ๊ฐ’์ด ์ตœ๋Œ“๊ฐ’์ด ๋œ๋‹ค. 
    • ๊ฐ€์žฅ ์ ์€ ์ˆ˜์˜ ์„ฑ๋ƒฅ ๊ฐœ๋น„(2๊ฐœ)๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜ '1'๋กœ ์ตœ๋Œ€ํ•œ ์ž๋ฆฟ์ˆ˜๋ฅผ ๋Š˜๋ ค์ค€๋‹ค.
    • ์„ฑ๋ƒฅ๊ฐœ๋น„์˜ ๊ฐœ์ˆ˜ num์ด ์ง์ˆ˜์ผ ๊ฒฝ์šฐ, num//2ํ•œ ๋งŒํผ '1'๋กœ ์ฑ„์›Œ์ฃผ๋ฉด ๋œ๋‹ค.
    • num์ด ํ™€์ˆ˜์ผ ๊ฒฝ์šฐ, ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ๋งŒ ์„ฑ๋ƒฅ๊ฐœ๋น„๊ฐ€ 3๊ฐœ ํ•„์š”ํ•œ '7'๋กœ ์ฑ„์›Œ์ฃผ๊ณ  ๋‚˜๋จธ์ง€ ์ž๋ฆฟ์ˆ˜๋Š” ๋ชจ๋‘ '1'๋กœ ์ฑ„์›Œ์ค€๋‹ค.
      • '7'+'1'*(num//2-1)
  • n๊ฐœ์˜ ์„ฑ๋ƒฅ๊ฐœ๋น„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ตœ์†Ÿ๊ฐ’์€ DP๋ฅผ ์ด์šฉํ•ด์„œ ํ’€๋ฉด ๋œ๋‹ค.

  • ์„ฑ๋ƒฅ๊ฐœ๋น„ ๊ฐœ์ˆ˜๋ณ„๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜์˜ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ numbers ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, numbers[2]๋Š” ์„ฑ๋ƒฅ๊ฐœ๋น„ 2๊ฐœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์ด๋ฏ€๋กœ 1์ด ์ €์žฅ๋œ๋‹ค. 
    • ๋˜, numbers[6]๋Š” ์„ฑ๋ƒฅ๊ฐœ๋น„ 6๊ฐœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์ด๋ฏ€๋กœ 0์ด ์ €์žฅ๋œ๋‹ค.
  • ํŒŒ์ด์ฌ์˜ ์ •์ˆ˜ ์ตœ๋Œ“๊ฐ’์ด ์ €์žฅ๋œ sys.maxsize๋กœ dp ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
    • dp[n]์€ n๊ฐœ์˜ ์„ฑ๋ƒฅ๊ฐœ๋น„๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์ด๋‹ค.
    • ์ฒ˜์Œ์—” ์Šต๊ด€์ฒ˜๋Ÿผ 1e9๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค๊ฐ€, ๋‚˜์ค‘์— 10000088888 ์ด๋Ÿฐ ์ˆ˜๊ฐ€ ๋‚˜์™€์„œ 1e9๋กœ ์ดˆ๊ธฐํ™”ํ•ด์„œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ min ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•ด์„œ sys.maxsize๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค. (์•ฝ 9๊ฒฝ ์ •๋„์˜ ์ˆซ์ž๋ผ๊ณ  ํ•œ๋‹ค..)
  • dp[2]~dp[7]๊นŒ์ง€๋Š” dp[6]๋ฅผ ์ œ์™ธํ•˜๊ณ , ๋ชจ๋‘ ํ•œ์ž๋ฆฌ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์œผ๋กœ, numbers ๋ฐฐ์—ด ๊ฐ’๊ณผ ๋™์ผํ•˜๋‹ค.
    • dp[6]๋Š” ์ˆ˜์˜ ๊ฐ€์žฅ ์•ž ์ž๋ฆฌ์— 0์ด ์˜ฌ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ numbers[0]์ด ์•„๋‹ˆ๋ผ 6์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
  • dp[8]๋ถ€ํ„ฐ dp[100]๊นŒ์ง€ for๋ฌธ์„ ๋Œ๋ฉด์„œ numbers ๋ฐฐ์—ด์— ์ €์žฅ๋œ ํ•œ ์ž๋ฆฌ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ์„ฑ๋ƒฅ์˜ ๊ฐœ์ˆ˜ 2~7๊ฐœ๋ฅผ ํ•˜๋‚˜์”ฉ ๋„ฃ์–ด๋ณด๋ฉด์„œ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค. 

  • ์ด์™€ ๊ฐ™์ด ์„ฑ๋ƒฅ๊ฐœ๋น„ ๊ฐœ์ˆ˜๊ฐ€ 100์ผ ๋•Œ๊นŒ์ง€ ๋ชจ๋“  dp ๋ฐฐ์—ด์„ ์ฑ„์šฐ๊ณ , n์„ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค dp[n] ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.