[Baekjoon/๐ŸฅˆSilverโ…ฃ] 2839: ์„คํƒ• ๋ฐฐ๋‹ฌ

2 ๋ถ„ ์†Œ์š”

๐Ÿ™‹โ€โ™€๏ธ ์„คํƒ• ๋ฐฐ๋‹ฌ

์ƒ๊ทผ์ด๋Š” ์š”์ฆ˜ ์„คํƒ•๊ณต์žฅ์—์„œ ์„คํƒ•์„ ๋ฐฐ๋‹ฌํ•˜๊ณ  ์žˆ๋‹ค. ์ƒ๊ทผ์ด๋Š” ์ง€๊ธˆ ์‚ฌํƒ•๊ฐ€๊ฒŒ์— ์„คํƒ•์„ ์ •ํ™•ํ•˜๊ฒŒ Nํ‚ฌ๋กœ๊ทธ๋žจ์„ ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ์„คํƒ•๊ณต์žฅ์—์„œ ๋งŒ๋“œ๋Š” ์„คํƒ•์€ ๋ด‰์ง€์— ๋‹ด๊ฒจ์ ธ ์žˆ๋‹ค. ๋ด‰์ง€๋Š” 3ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€์™€ 5ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€๊ฐ€ ์žˆ๋‹ค.

์ƒ๊ทผ์ด๋Š” ๊ท€์ฐฎ๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ๋Œ€ํ•œ ์ ์€ ๋ด‰์ง€๋ฅผ ๋“ค๊ณ  ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 18ํ‚ฌ๋กœ๊ทธ๋žจ ์„คํƒ•์„ ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•  ๋•Œ, 3ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€ 6๊ฐœ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋„ ๋˜์ง€๋งŒ, 5ํ‚ฌ๋กœ๊ทธ๋žจ 3๊ฐœ์™€ 3ํ‚ฌ๋กœ๊ทธ๋žจ 1๊ฐœ๋ฅผ ๋ฐฐ๋‹ฌํ•˜๋ฉด, ๋” ์ ์€ ๊ฐœ์ˆ˜์˜ ๋ด‰์ง€๋ฅผ ๋ฐฐ๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ๊ทผ์ด๊ฐ€ ์„คํƒ•์„ ์ •ํ™•ํ•˜๊ฒŒ Nํ‚ฌ๋กœ๊ทธ๋žจ ๋ฐฐ๋‹ฌํ•ด์•ผ ํ•  ๋•Œ, ๋ด‰์ง€ ๋ช‡ ๊ฐœ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋ฉด ๋˜๋Š”์ง€ ๊ทธ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.


๐Ÿ™‹โ€โ™€๏ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (3 โ‰ค N โ‰ค 5000)

๐Ÿ™‹โ€โ™€๏ธ ์ถœ๋ ฅ

์ƒ๊ทผ์ด๊ฐ€ ๋ฐฐ๋‹ฌํ•˜๋Š” ๋ด‰์ง€์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ, ์ •ํ™•ํ•˜๊ฒŒ Nํ‚ฌ๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.


๐Ÿ‘ฉโ€๐Ÿ’ป Algoritm: greedy

ํ•„์ž๋Š” ๊ฐ€์žฅ ๋จผ์ € ํƒ์š•๊ธฐ๋ฒ•(greedy)์„ ์ ์šฉํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ–ˆ๋‹ค.

๋ด‰์ง€์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ 5ํ‚ฌ๋กœ๊ทธ๋žจ์˜ ๋ด‰์ง€๋ฅผ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์“ฐ๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ‘ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜1: 5ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€ ์‚ฌ์šฉ์˜ ์ตœ๋Œ€๋ฅผ ๊ตฌํ•œ ํ›„ ์ค„์—ฌ ๋‚˜๊ฐ„๋‹ค.

N = int(input())

five = N//5 # 5ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€๋ฅผ ์ตœ๋Œ€๋กœ ์“ธ ๊ฒฝ์šฐ

for i in range(five, -1, -1): # 5ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€๋ฅผ ํ•˜๋‚˜์”ฉ ์ค„์—ฌ๊ฐ„๋‹ค.
  three = (N-(i*5))%3
  if three == 0:
    print(i+((N-(i*5))//3))
    break
else:
  print(-1)


๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค ํ’€์ด๋ฅผ ๋ณด๋‹ค ๋ณด๋‹ˆ ๊ณตํ†ต์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๊ทธ๋ฆฌ๋””๋ฅผ ์ ์šฉํ•˜๊ณ  ์žˆ์–ด ํ•ด๋‹น ๋ฌธ์ œ ํ’€์ด๋„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

๐Ÿ‘ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜2: 5๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋‚˜? 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋‚˜?

ํ’€์ด ๊ณผ์ •์„ ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค!

  • N์ด 5๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง„๋‹ค๋ฉด N//5๋กœ ๋ด‰์ง€์ˆ˜๋ฅผ ๊ตฌํ•œ ํ›„ ์ถœ๋ ฅํ•œ๋‹ค.
  • N์ด 5๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์ด์ง€์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค์Œ์˜ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
    • N-3์„ ํ•˜์—ฌ 3ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€๋ฅผ ํ•˜๋‚˜ ์‚ฌ์šฉํ•œ๋‹ค.
    • N์ด 0๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ, ์ •ํ™•ํ•˜๊ฒŒ Nํ‚ฌ๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋ฏ€๋กœ -1์„ ์ถœ๋ ฅํ•œ๋‹ค.
N = int(input())
cnt = 0

while 1:
  if N % 5 != 0:
    cnt += 1
    N -= 3
  elif N % 5 == 0:
    print(cnt + N//5)
    break
  
  if N < 0:
    print(-1)
    break


๐Ÿ‘ฉโ€๐Ÿ’ป Algoritm: dp

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ dp๋ฅผ ์ ์šฉํ•ด ํ’€์ดํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๋‚˜๋Š” dp๋ฅผ ์ ์šฉํ•ด๋ณผ ์ƒ๊ฐ์„ ์•„์˜ˆ ์•ˆํ•ด๋ดค๋‹คโ€ฆใ…Žใ…Žใ…Ž ์ •๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ๊ทธ ๊ณผ์ •์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ตํžˆ์ž!!!


๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ์— dp๊ฐ€ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ์ผ๊นŒ???๐Ÿ™„

  • ๊ฐ๊ฐ Nํ‚ฌ๋กœ๊ทธ๋žจ์ผ๋•Œ ๊ฐ’์€ ๊ณผ์—ฐ ์–ด๋–ป๊ฒŒ ์–ป์–ด์ง€๋Š” ๊ฒƒ์ผ๊นŒ?
    • [N-5] ํ‚ฌ๋กœ๊ทธ๋žจ์ผ ๋•Œ ์ตœ์†Œ ๋ด‰์ง€์—๋‹ค 5ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€ ํ•˜๋‚˜!
    • [N-3] ํ‚ฌ๋กœ๊ทธ๋žจ์ผ ๋•Œ ์ตœ์†Œ ๋ด‰์ง€์—๋‹ค 3ํ‚ฌ๋กœ๊ทธ๋žจ ๋ด‰์ง€ ํ•˜๋‚˜!
    • ์œ„ ๋‘ ๊ฐ’ ์ค‘ ์ตœ์†Œ ๊ฐ’ + 1 => ์ ํ™”์‹: min(dp[n-3], dp[n-5])

๊ทธ๋ ‡๋‹ค! Nํ‚ฌ๋กœ๊ทธ๋žจ์ผ ๋•Œ ์ตœ์†Œ ๋ด‰์ง€๋Š” ์˜ค์ง [N-5], [N-3]ํ‚ฌ๋กœ๊ทธ๋žจ์ผ ๋•Œ์˜ ๋ด‰์ง€ ์ˆ˜์— ์˜ํ•ด์„œ ๊ฒฐ์ •๋œ๋‹ค! ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” dp๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค!


๐Ÿ‘ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜1: dp ์ ์šฉ!

N = int(input())
dp = [-1 for _ in range(N+1)]

if N >= 3:
  dp[3] = 1
if N >= 5:
  dp[5] = 1

for i in range(6, N+1):
  if dp[i-5] == -1 and dp[i-3] == -1:
    continue
  elif dp[i-5] == -1:
    dp[i] = dp[i-3] +1
  elif dp[i-3] == -1:
    dp[i] = dp[i-5] +1
  else:
    dp[i] = min(dp[i-5], dp[i-3]) +1

print(dp[N])
  • ์ดˆ๊ธฐ๊ฐ’์€ -1๋กœ ์ง€์ •ํ•œ๋‹ค.
  • dp[n-5], dp[n-3]์ด ๋ชจ๋‘ -1์ผ ๊ฒฝ์šฐ, ์ •ํ™•ํ•˜๊ฒŒ nํ‚ฌ๋กœ๊ทธ๋žจ์„ ๋งž์ถœ ์ˆ˜ ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ์ดˆ๊ธฐ๊ฐ’ -1์ด ์œ ์ง€๋œ๋‹ค.
  • dp[n-5], dp[n-3] ์ค‘ ํ•˜๋‚˜๋ผ๋„ -1์ด ์•„๋‹ˆ๋ผ๋ฉด ์•„๋‹Œ ํ‚ฌ๋กœ๊ทธ๋žจ์— ๋ด‰์ง€ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ nํ‚ฌ๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • dp[n-5], dp[n-3] ๋ชจ๋‘ -1์ด ์•„๋‹ˆ๋ผ๋ฉด ๋‘˜ ์ค‘ ์ตœ์†Œ๊ฐ’์„ ์„ ํƒํ•ด ๋ด‰์ง€ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ nํ‚ฌ๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.


ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๊ทธ์น  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜ ๋” ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค! ์—ฌ๊ธฐ์„œ ๊ณต๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ n์ผ ๋•Œ ํ•„์š”ํ•œ ๋ถ€๋ถ„์€ n-5๊นŒ์ง€๋งŒ ํ•„์š”ํ•˜๊ณ  ๊ทธ ์ด์ „ ๊ฐ’๋“ค์€ ํ•„์š”ํ•˜์ง€ ์•Š๋Š”๋‹ค!!

โญ์ฆ‰! 0-5๊นŒ์ง€๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค!!โญ


๐Ÿ‘ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜2: ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ค„์ด๊ธฐ

N = int(input())
dp = [-1 for _ in range(6)]

if N >= 3:
  dp[3] = 1
if N >= 5:
  dp[5] = 1

for i in range(6, N+1):
  if dp[(i-5)%6] == -1 and dp[(i-3)%6] == -1:
    continue
  elif dp[(i-5)%6] == -1:
    dp[i%6] = dp[(i-3)%6] +1
  elif dp[(i-3)%6] == -1:
    dp[i%6] = dp[(i-5)%6] +1
  else:
    dp[i%6] = min(dp[(i-5)%6], dp[(i-3)%6]) +1

print(dp[N%6])


๐Ÿ“ ์ฐธ๊ณ  ์ž๋ฃŒ

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ