Super Kawaii Cute Cat Kaoani
λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/Python

[Python] 1이 될 λ•ŒκΉŒμ§€ (그리디 μ•Œκ³ λ¦¬μ¦˜)

728x90


πŸ’‘ 문제 μ„€λͺ….

• μ–΄λ– ν•œ 수 N이 1이 될 λ•ŒκΉŒμ§€ λ‹€μŒμ˜ 두 κ³Όμ • 쀑 ν•˜λ‚˜λ₯Ό 반볡적으둜 μ„ νƒν•˜μ—¬ μˆ˜ν–‰ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 단, 두 번째 연산은 N이 K둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§ˆ λ•Œλ§Œ 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. Nμ—μ„œ 1을 λΊλ‹ˆλ‹€.
  2. N을 K둜 λ‚˜λˆ•λ‹ˆλ‹€.

• 예λ₯Ό λ“€μ–΄ N이 17, Kκ°€ 4라고 κ°€μ •ν•©μ‹œλ‹€. μ΄λ•Œ 1번의 과정을 ν•œ 번 μˆ˜ν–‰ν•˜λ©΄ N은 16이 λ©λ‹ˆλ‹€. 이후에 2번의 과정을 두 번 μˆ˜ν–‰ν•˜λ©΄ N은 1이 λ©λ‹ˆλ‹€. 결과적으둜 이 경우 전체 과정을 μ‹€ν–‰ν•œ νšŸμˆ˜λŠ” 3이 λ©λ‹ˆ λ‹€. μ΄λŠ” N을 1둜 λ§Œλ“œλŠ” μ΅œμ†Œ νšŸμˆ˜μž…λ‹ˆλ‹€.

• Nκ³Ό Kκ°€ μ£Όμ–΄μ§ˆ λ•Œ N이 1이 될 λ•ŒκΉŒμ§€ 1번 ν˜Ήμ€ 2번의 과정을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” μ΅œμ†Œ 횟수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

πŸ’‘ 문제 쑰건.

λ‚œμ΄λ„ 🟒βšͺ️βšͺ️ | 풀이 μ‹œκ°„ 15λΆ„ | μ‹œκ°„μ œν•œ 2초 | λ©”λͺ¨λ¦¬ μ œν•œ 128MB

μž…λ ₯ 쑰건

  • 첫째 쀄에 N(1 <= N <= 100,000)κ³Ό K(2 <= K <= 100,000)κ°€ 곡백을 κΈ°μ€€μœΌλ‘œ ν•˜μ—¬ 각각 μžμ—°μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

좜λ ₯ 쑰건

  • 첫째 쀄에 N이 1이 될 λ•ŒκΉŒμ§€ 1번 ν˜Ήμ€ 2번의 과정을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” 횟수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•©λ‹ˆλ‹€.

μž…λ ₯ μ˜ˆμ‹œ

25 5

좜λ ₯ μ˜ˆμ‹œ

2

πŸ’‘ 문제 ν•΄κ²° 아이디어.

  • Nμ—μ„œ 1을 λΉΌλŠ” 연산은 항상 선택 κ°€λŠ₯ν•˜λ―€λ‘œ, λΊ„μ…ˆ 연산을 μ΅œμ†Œν™”ν•˜κΈ° μœ„ν•΄ N을 K둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€κ²Œλ” λ§Œλ“ λ‹€.
  • N을 K둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€κ²Œλ” λ§Œλ“  ν›„, λ‚˜λˆ„κΈ° 연산을 ν•œ 번 μˆ˜ν–‰ν•˜λ©΄ λΊ„μ…ˆ 연산보닀 λΉ λ₯΄κ²Œ 수λ₯Ό 쀄일 수 μžˆλ‹€.
  • 반볡적으둜 μœ„ 두 과정을 μˆ˜ν–‰ν•˜λ©΄μ„œ N을 μ΅œμ’…μ μœΌλ‘œ 1둜 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

βœ… λ‚΄κ°€ 적은 λ‹΅.

n, k = map(int, input().split())

cnt = 0

while (n != 1):
    if n % k == 0:
        n = n / k
        cnt += 1
    else:
        n = n - 1
        cnt += 1

print(cnt)

 

βœ”οΈ μ²˜μŒμ— while 쑰건을 ν—·κ°ˆλ €μ„œ λ¬΄ν•œ 루프 λŒλ €λ²„λ Έλ‹€. (자꾸 멈좜 쑰건을 λ„£μŒ.) while '쑰건'이면 λ°˜λ³΅ν•œλ‹€.

 

βœ”οΈ map(int, input().split())

input() : μ‚¬μš©μžλ‘œλΆ€ν„° ν‚€λ³΄λ“œλ‘œ μž…λ ₯을 λ°›λŠ” ν•¨μˆ˜

split() : μž…λ ₯받은 값을 곡백을 κΈ°μ€€μœΌλ‘œ λ‚˜λˆ„μ–΄ 리슀트둜 λ°˜ν™˜
map(int, ...) : λ‚˜λ‰œ 각각의 값에 λŒ€ν•΄ μ •μˆ˜ λ³€ν™˜

 

βœ”οΈ μž…λ ₯ 값이 큰 수일 λ•Œλ₯Ό κ³ λ €ν•˜μ§€ λͺ»ν–ˆλ‹€.

βœ… 이것이 μ½”λ”©ν…ŒμŠ€νŠΈλ‹€ μ •λ‹΅.

# N, K을 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ μž…λ ₯ λ°›κΈ°
n, k = map(int, input().split())

# μ΅œμ†Œ 횟수 μ €μž₯ν•  λ³€μˆ˜
result = 0

while True:

    # (첫번째 μ—°μ‚°) N이 K둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” μˆ˜κ°€ 될 λ•ŒκΉŒμ§€ 1을 λΉΌκΈ°
    target = (n // k) * k
    result += (n - target)
    n = target
    
    # (λ‘λ²ˆμ§Έ μ—°μ‚°) N이 K보닀 μž‘μ•„μ§ˆ λ•ŒκΉŒμ§€ K둜 λ‚˜λˆ„κΈ°
    if n < k:
        break
    result += 1
    n //= k

# λ§ˆμ§€λ§‰μœΌλ‘œ 남은 μˆ˜μ— λŒ€ν•˜μ—¬ 1μ”© λΉΌκΈ°
result += (n - 1)

# μ΅œμ’… κ²°κ³Ό 좜λ ₯
print(result)

 

βœ”οΈ target : λͺ« μ—°μ‚° 이용, n을 k둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€κ²Œ λ§Œλ“€ κ°€μž₯ 큰 수

 

βœ”οΈ μž…λ ₯κ°’ n = 25, k = 3 일 λ•Œ,

 

  1. 첫 번째 반볡:
    1. target = (25 // 3) * 3 = 24: 25λ₯Ό 3으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€κ²Œ λ§Œλ“  κ°€μž₯ 큰 μˆ˜λŠ” 24.
    2. result += (25 - 24): 25μ—μ„œ 24λ₯Ό λΊ€ κ²°κ³Όλ₯Ό result에 더함 (λΊ„μ…ˆ μ—°μ‚°).
      λ”°λΌμ„œ, result = 1.
    3. n //= k: n을 k둜 λ‚˜λˆˆ λͺ«μœΌλ‘œ μ—…λ°μ΄νŠΈ.
      λ”°λΌμ„œ, n = 8.result += 1: result에 1을 더함 (λ‚˜λˆ„κΈ° μ—°μ‚°).
      λ”°λΌμ„œ, result = 2.
  2. 두 λ²ˆμ§Έ λ°˜λ³΅:
    1. target = (8 // 3) * 3 = 6: 8을 3으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€κ²Œ λ§Œλ“  κ°€μž₯ 큰 μˆ˜λŠ” 6.
    2. result += (8 - 6): 8μ—μ„œ 6을 λΊ€ κ²°κ³Όλ₯Ό result에 더함 (λΊ„μ…ˆ μ—°μ‚°).
      λ”°λΌμ„œ, result = 3.
    3. n //= k: n을 k둜 λ‚˜λˆˆ λͺ«μœΌλ‘œ μ—…λ°μ΄νŠΈ.
      λ”°λΌμ„œ, n = 2.
    4. result += 1: result에 1을 더함 (λ‚˜λˆ„κΈ° μ—°μ‚°).
      λ”°λΌμ„œ, result = 4.
  3. μ„Έ λ²ˆμ§Έ λ°˜λ³΅:
    1. target = (2 // 3) * 3 = 0: 2λ₯Ό 3으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€κ²Œ λ§Œλ“  κ°€μž₯ 큰 μˆ˜λŠ” 0.
    2. result += (2 - 0): 2μ—μ„œ 0을 λΊ€ κ²°κ³Όλ₯Ό result에 더함 (λΊ„μ…ˆ μ—°μ‚°).
      λ”°λΌμ„œ, result = 6.
    3. n < k μ΄λ―€λ‘œ λ°˜λ³΅ μ’…λ£Œ.

λ”°λΌμ„œ, μ΅œμ’…μ μœΌλ‘œ result = 6이 λœλ‹€.

728x90