파이썬 μ•Œκ³ λ¦¬μ¦˜

[μ΄μ½”ν…Œ Ch3-4] 1이 될 λ•ŒκΉŒμ§€ (그리디)

은진 2021. 12. 19. 21:32

πŸ‘©πŸ»β€πŸ’»λ¬Έμ œμ„€λͺ…

[μ΄μ½”ν…Œ Ch3-4] 1이 될 λ•ŒκΉŒμ§€ (그리디)
μ΄μ½”ν…Œ

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

1. Nμ—μ„œ 1을 λΊ€λ‹€. 
2. N을 K둜 λ‚˜λˆˆλ‹€. (N이 K둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§ˆ λ•Œλ§Œ 선택가λŠ₯)

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


μž…λ ₯쑰건

  • 첫째쀄에 N(2 <= N < = 100000)κ³Ό K(2 <= K < = 100000)κ°€ 곡백으둜 κ΅¬λΆ„λ˜λ©° 각각 μžμ—°μˆ˜λ‘œ 주어진닀. μ΄λ•Œ μž…λ ₯으둜 μ£Όμ–΄μ§€λŠ” N은 항상 K보닀 ν¬κ±°λ‚˜ κ°™λ‹€.

좜λ ₯쑰건

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


μž…λ ₯ μ˜ˆμ‹œ

25 5

좜λ ₯ μ˜ˆμ‹œ

2


✍️Idea Sketch

μ•Œκ³ λ¦¬μ¦˜ : κ·Έλ¦¬λ“œ
해법 : 주어진 N에 λŒ€ν•˜μ—¬ K둜 μ΅œλŒ€ν•œ 많이 λ‚˜λˆ΄μ„ λ•Œ κ°€μž₯ λΉ λ₯΄κ²Œ N = 1을 λ§Œλ“€ 수 μžˆλ‹€.


μ‹œκ°„λ³΅μž‘λ„

항상 μ—°μ‚° 1 (Nμ—μ„œ 1을 λΊ€λ‹€) 만 μˆ˜ν–‰ν•˜λŠ” μ΅œμ•…μ˜ 상황을 κ³ λ €ν•΄λ³΄μž. 이 경우 O(n)이며, 이 λ•Œ n은 100,000이닀. μ΄λŠ” 1얡에 ν•œμ°Έ λͺ» λ―ΈμΉ˜λ―€λ‘œ μ‹œκ°„ 초과의 μ—Όλ €κ°€ μ—†λ‹€.


κ°œμ„ λ°©μ•ˆ

μ—°μ‚° 1 (Nμ—μ„œ 1을 λΊ€λ‹€) 을 κ°œμ„ ν•΄λ³΄μž. λ‹¨μˆœ λ‹΅μ•ˆμ˜ 경우, N이 K둜 λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€λŠ” 값이 될 λ•ŒκΉŒμ§€ Nμ—μ„œ 1μ”© μ°¨κ·Όμ°¨κ·Ό λΊ€λ‹€. 이λ₯Ό κ°œμ„ ν•˜μ—¬ Nμ—μ„œ 1을 μ–Όλ§ˆλ‚˜ λΉΌμ•Ό ν•˜λŠ”μ§€ κ³„μ‚°ν•˜μ—¬ ν•œ λ²ˆμ— 빼자. N을 K둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό Nμ—μ„œ λΉΌλ©΄ λœλ‹€.


βœοΈλ‚΄ μ†ŒμŠ€μ½”λ“œ 1

λ‹¨μˆœ λ‹΅μ•ˆ : Nμ—μ„œ 1μ”© λΉΌκΈ°

  import sys
  si = sys.stdin.readline
  LIMIT = 100_000

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

  for cnt in range(LIMIT):
    # μ’…λ£Œμ‘°κ±΄
    if n == 1:
      print(cnt)
      break

    # μ—°μ‚° 2
    if n % k == 0:
      n = int(n/k)

    # μ—°μ‚° 1 : Nμ—μ„œ 1μ”© λΉΌκΈ°
    else:
      n -= 1


βœοΈλ‚΄ μ†ŒμŠ€μ½”λ“œ 2

κ°œμ„ λ‹΅μ•ˆ : N을 K둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό Nμ—μ„œ λΉΌκΈ°

  import sys
  n, k = map(int, si().split())
  cnt = 0

  while n > 1:  # μ’…λ£Œμ‘°κ±΄
      # μ—°μ‚° 2
      if n % k == 0:
          n = int(n / k)
          cnt += 1

      # μ—°μ‚° 1 : N을 K둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό Nμ—μ„œ λΉΌκΈ°
      else:
          cnt += (n % k) 
          n -= (n % k)

  print(cnt if n else cnt - 1)  # n이 0인 경우 n + 1, cnt - 1