그리디 & κ΅¬ν˜„ # 1

2020. 11. 25. 11:42γ†πŸ“ μ½”λ”© ν…ŒμŠ€νŠΈ/Python

λ°˜μ‘ν˜•

그리디 μ•Œκ³ λ¦¬μ¦˜

- 그리디 μ•Œκ³ λ¦¬μ¦˜(νƒμš•λ²•)은 ν˜„μž¬ μƒν™©μ—μ„œ μ§€κΈˆ λ‹Ήμž₯ 쒋은 κ²ƒλ§Œ κ³ λ₯΄λŠ” 방법을 의미

- 일반적인 그리디 μ•Œκ³ λ¦¬μ¦˜μ€ 문제λ₯Ό ν’€κΈ° μœ„ν•œ μ΅œμ†Œν•œμ˜ 아이디어λ₯Ό λ– μ˜¬λ¦΄ 수 μžˆλŠ” λŠ₯λ ₯을 μš”κ΅¬ν•©λ‹ˆλ‹€.

- μ •λ‹Ήμ„± 뢄석이 μ€‘μš”

 

<문제> κ±°μŠ€λ¦„ 돈: 문제 μ„€λͺ…

- 졜적의 ν•΄λ₯Ό λΉ λ₯΄κ²Œ κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” κ°€μž₯ 큰 화폐 λ‹¨μœ„λΆ€ν„° λˆμ„ 거슬러 μ£Όλ©΄ λœλ‹€.

 

<문제> κ±°μŠ€λ¦„  돈: μ •λ‹Ήμ„± 뢄석

- κ°€μž₯ 큰 화폐 λ‹¨μœ„λΆ€ν„° λˆμ„ 거슬러 μ£ΌλŠ” 것이 졜적의 ν•΄λ₯Ό 보μž₯ν•˜λŠ” μ΄μœ λŠ”?

   - κ°€μ§€κ³  μžˆλŠ” 동전 μ€‘μ—μ„œ 큰 λ‹¨μœ„κ°€ 항상 μž‘μ€ λ‹¨μœ„μ˜ λ°°μˆ˜μ΄λ―€λ‘œ μž‘μ€ λ‹¨μœ„μ˜ 동전듀을 μ’…ν•©ν•΄ λ‹€λ₯Έ ν•΄κ°€ λ‚˜μ˜¬ 수 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

<문제> κ±°μŠ€λ¦„ 돈: λ‹΅μ•ˆ μ˜ˆμ‹œ(Python)

n = 1260
count = 0

# 큰 λ‹¨μœ„μ˜ 화폐뢀터 μ°¨λ‘€λŒ€λ‘œ ν™•μΈν•˜κΈ°
array = [500, 100, 50, 10]

for coin in array:
	count += n // coin # ν•΄λ‹Ή ν™”νλ‘œ 거슬러 쀄 수 μžˆλŠ” λ™μ „μ˜ 개수 μ„ΈκΈ°
    n %= coin
    
print(count)

 

<문제> κ±°μŠ€λ¦„ 돈: μ‹œκ°„ λ³΅μž‘λ„ 뢄석

- ν™”νμ˜ μ’…λ₯˜κ°€ K라고 ν•  λ•Œ, μ†ŒμŠ€μ½”λ“œμ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(K)μž…λ‹ˆλ‹€.

 

<문제> 1이 될 λ•ŒκΉŒμ§€: 문제 μ„€λͺ…

- μ–΄λ– ν•œ 수 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번의 과정을 μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” μ΅œμ†Œ 횟수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

 

<문제> 1이 될 λ•ŒκΉŒμ§€: 문제 쑰건

<문제> 1이 될 λ•ŒκΉŒμ§€: 문제 ν•΄κ²° 아이디어

<문제> 1이 될 λ•ŒκΉŒμ§€: μ •λ‹Ήμ„± 뢄석

- κ°€λŠ₯ν•˜λ©΄ μ΅œλŒ€ν•œ 많이 λ‚˜λˆ„λŠ” μž‘μ—…μ΄ 졜적의 ν•΄λ₯Ό 항상 보μž₯ν•  수 μžˆμ„κΉŒμš”?

- N이 아무리 큰 μˆ˜μ—¬λ„, K둜 계속 λ‚˜λˆˆλ‹€λ©΄ κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ λΉ λ₯΄κ²Œ 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

 

<문제> 1이 될 λ•ŒκΉŒμ§€: λ‹΅μ•ˆ μ˜ˆμ‹œ (Python)

# 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보닀 μž‘μ„ λ•Œ (더 이상 λ‚˜λˆŒ 수 없을 λ•Œ) 반볡문 νƒˆμΆœ
    if n < k:
    	break
    # K둜 λ‚˜λˆ„κΈ°
    result += 1
    n //= k
    
# λ§ˆμ§€λ§‰μœΌλ‘œ 남은 μˆ˜μ— λŒ€ν•˜μ—¬ 1μ”© λΉΌκΈ°
result += (n - 1)
print(result)

 

<문제> κ³±ν•˜κΈ° ν˜Ήμ€ λ”ν•˜κΈ°: 문제 μ„€λͺ…

- 각 μžλ¦¬κ°€ 숫자(0λΆ€ν„° 9)둜만 이루어진 λ¬Έμžμ—΄ Sκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, μ™Όμͺ½λΆ€ν„° 였λ₯Έμͺ½μœΌλ‘œ ν•˜λ‚˜μ”© λͺ¨λ“  숫자λ₯Ό ν™•μΈν•˜λ©° 숫자 사이에 'x' ν˜Ήμ€ '+' μ—°μ‚°μžλ₯Ό λ„£μ–΄ 결과적으둜 λ§Œλ“€μ–΄μ§ˆ 수 μžˆλŠ” κ°€μž₯ 큰 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”. 단, +보닀 x λ₯Ό λ¨Όμ € κ³„μ‚°ν•˜λŠ” μΌλ°˜μ μ€ λ°©μ‹κ³ΌλŠ” 달리, λͺ¨λ“  연산은 μ™Όμͺ½λΆ€ν„° μˆœμ„œλŒ€λ‘œ 이루어진닀고 κ°€μ •ν•©λ‹ˆλ‹€.


<문제> κ³±ν•˜κΈ° ν˜Ήμ€ λ”ν•˜κΈ°: 문제 쑰건

<문제> κ³±ν•˜κΈ° ν˜Ήμ€ λ”ν•˜κΈ°: 문제 ν•΄κ²° 아이디어

- λŒ€λΆ€λΆ„μ˜ 경우 '+'λ³΄λ‹€λŠ” 'x'κ°€ 더 값을 크게 λ§Œλ“­λ‹ˆλ‹€.

   - 예λ₯Ό λ“€μ–΄ 5 + 6 = 11이고, 5 x 6 = 30μž…λ‹ˆλ‹€.

- λ‹€λ§Œ 두 수 μ€‘μ—μ„œ ν•˜λ‚˜λΌλ„ '0' ν˜Ήμ€ '1'인 경우, κ³±ν•˜κΈ°λ³΄λ‹€λŠ” λ”ν•˜κΈ°λ₯Ό μˆ˜ν–‰ν•˜λŠ” 것이 νš¨μœ¨μ μž…λ‹ˆλ‹€.

- λ”°λΌμ„œ 두 μˆ˜μ— λŒ€ν•˜μ—¬ 연산을 μˆ˜ν–‰ν•  λ•Œ, 두 수 μ€‘μ—μ„œ ν•˜λ‚˜λ‘œ 1 μ΄ν•˜μΈ κ²½μš°μ—λŠ” λ”ν•˜λ©°, 두 μˆ˜κ°€ λͺ¨λ‘ 2 이상인 κ²½μš°μ—λ§Œ κ³±ν•˜λ©΄ μ •λ‹΅μž…λ‹ˆλ‹€.

 

<문제> κ³±ν•˜κΈ° ν˜Ήμ€ λ”ν•˜κΈ°: λ‹΅μ•ˆ μ˜ˆμ‹œ (Python)

data = input()

# 첫 번째 문자λ₯Ό 숫자둜 λ³€κ²½ν•˜μ—¬ λŒ€μž…
result = int(data[0])

for i in range(1, len(data)):
	# 두 수 μ€‘μ—μ„œ ν•˜λ‚˜λΌλ„ '0' ν˜Ήμ€ '1'인 경우, κ³±ν•˜κΈ°λ³΄λ‹€λŠ” λ”ν•˜κΈ° μˆ˜ν–‰
    num = int(data[i])
    if num <= 1 or result <= 1:
    	result += num
    else:
    	result *= num
        
print(result)        

 

λ°˜μ‘ν˜•