๐Ÿ’ป Language/Python : ํŒŒ์ด์ฌ

[Python] ๋ฐฑ์ค€ ์˜จ๋ผ์ธ ์ €์ง€ Greedy Algorithm(๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜) - 1

mxnxeonx 2024. 8. 29. 16:45
728x90
728x90

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜(Greedy Algorithm)

"๋งค ์„ ํƒ์—์„œ ์ง€๊ธˆ ์ด ์ˆœ๊ฐ„ ๊ฐ€์žฅ ์ตœ์ ์ธ ๋‹ต์„ ์„ ํƒํ•˜์—ฌ ์ ํ•ฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜์ž"

Greedy(ํƒ์š•, ์š•์‹ฌ์Ÿ์ด)๋ผ๋Š” ์ด๋ฆ„์ฒ˜๋Ÿผ, ์ง€๊ธˆ ๋‹น์žฅ ์ตœ์ ์ธ ๋‹ต์„ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์„ ๋‹จ์ˆœ ๋ฐ˜๋ณตํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ๊ฐ ๋‹จ๊ณ„์—์„œ ๋ฏธ๋ž˜๋ฅผ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ , ๊ทธ ์ˆœ๊ฐ„ ์ตœ์„ ์˜ ์„ ํƒ์„ ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข…์ ์œผ๋กœ๋Š” ์ตœ์ ์˜ ํ•ด๋ฅผ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.

  • ์ง€์—ญ์ (local)์œผ๋กœ๋Š” ์ตœ์ ์˜ ์„ ํƒ์ด์ง€๋งŒ, ์ „์ฒด์ (global)์œผ๋กœ๋Š” ์ตœ์ ์˜ ํ•ด๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค.
  • ๋งค ์ˆœ๊ฐ„ ์ตœ์ ์„ ๋”ฐ๋ผ๊ฐ€๋ฉด 1-1-1-100์ด์ง€๋งŒ, ์ค‘๊ฐ„์— ์‚ด์ง ๋จผ ๊ธธ์„ ์„ž์–ด 1-1-10-10์œผ๋กœ ์›€์ง์ผ ๋•Œ ์ตœ์ ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ.

๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํƒ์š• ์„ ํƒ ์†์„ฑ(Greedy Choice Property), ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ(Optimal Substructure) ํŠน์„ฑ์„ ๊ฐ€์ง€๋Š” ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๊ฐ•์ ์ด ์žˆ๋‹ค. ์ฆ‰, ํ•œ ๋ฒˆ์˜ ์„ ํƒ์ด ๋‹ค์Œ ์„ ํƒ์—๋Š” ์ „ํ˜€ ๋ฌด๊ด€ํ•œ ๊ฐ’์ด์–ด์•ผ ํ•˜๋ฉฐ ๋งค ์ˆœ๊ฐ„ ์ตœ์ ํ•ด๊ฐ€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์ ํ•ด์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

  • ํƒ์š• ์„ ํƒ ์†์„ฑ(Greedy Choice Property) : ํ˜„์žฌ ์„ ํƒ์ด ์ดํ›„์˜ ์„ ํƒ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ
  • ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ(Optimal Substructure) : ๋งค ์ˆœ๊ฐ„ ์ตœ์ ์˜ ํ•ด๊ฐ€ ๋ฌธ์ œ ์ „์ฒด์— ๋Œ€ํ•œ ์ตœ์ ์˜ ํ•ด์—ฌ์•ผ ํ•จ

์œ„ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜๋ฉด ์•„์ฃผ ๋น ๋ฅธ ์†๋„๋กœ ์ •๋‹ต์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

  • ๊ทผ์‚ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์œ„ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š๋”๋ผ๋„, ์–ด๋А ์ •๋„ ์ ํ•ฉํ•œ ์ˆ˜์ค€์˜ ํ•ด๋‹ต์„ ์ฐพ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ตœ์ ์ด ์•„๋‹Œ "๋˜๋Š”๊ฐ€" ๋˜๋Š” "์ ๋‹นํžˆ ๊ดœ์ฐฎ์€ ๋ฐฉ๋ฒ•"์„ ์ฐพ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป. ๊ณ„์‚ฐ ์†๋„๊ฐ€ ์ •ํ™•ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ๋น ๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์‹ค์šฉ์ !

 

11047๋ฒˆ ๋™์ „ 0

๋ฌธ์ œ ์ค€๊ทœ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋™์ „์€ ์ด N์ข…๋ฅ˜์ด๊ณ , ๊ฐ๊ฐ์˜ ๋™์ „์„ ๋งค์šฐ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๋™์ „์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์„œ ๊ทธ ๊ฐ€์น˜์˜ ํ•ฉ์„ K๋กœ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค. ์ด๋•Œ ํ•„์š”ํ•œ ๋™์ „ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
์ž…๋ ฅ ์ฒซ์งธ ์ค„์— N๊ณผ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๋™์ „์˜ ๊ฐ€์น˜ Ai๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2์ธ ๊ฒฝ์šฐ์— Ai๋Š” Ai-1์˜ ๋ฐฐ์ˆ˜)
์ถœ๋ ฅ ์ฒซ์งธ ์ค„์— K์›์„ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ ๋™์ „ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • ๋‚˜์—ด๋œ ๋™์ „ ์ค‘ ๊ธˆ์•ก์ด ๋†’์€ ์ˆœ์œผ๋กœ ๋‚จ์€ ๊ธˆ์•ก๊ณผ ๋น„๊ตํ•˜๋ฉฐ ๋™์ „์˜ ๊ฐœ์ˆ˜๋ฅผ ์นด์šดํŒ…ํ•œ๋‹ค.
n, k = map(int, input().split())
a = [0] * n # n๊ฐœ์˜ ๋™์ „

for i in range(n):
    a[i] = int(input())

count = 0 # ํ•„์š”ํ•œ ๋™์ „์˜ ๊ฐœ์ˆ˜

for i in range(n-1, -1, -1):
    if a[i] <= k:
        count += (k // a[i]) # ๋™์ „์˜ ๊ฐœ์ˆ˜
        k = k % a[i] # ๋‚จ์€ ๊ธˆ์•ก

print(count)

 

1931๋ฒˆ ํšŒ์˜์‹ค ๋ฐฐ์ •

๋ฌธ์ œ ํ•œ ๊ฐœ์˜ ํšŒ์˜์‹ค์ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” N๊ฐœ์˜ ํšŒ์˜์— ๋Œ€ํ•˜์—ฌ ํšŒ์˜์‹ค ์‚ฌ์šฉํ‘œ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค. ๊ฐ ํšŒ์˜ I์— ๋Œ€ํ•ด ์‹œ์ž‘์‹œ๊ฐ„๊ณผ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ์ฃผ์–ด์ ธ ์žˆ๊ณ , ๊ฐ ํšŒ์˜๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ํ•˜๋ฉด์„œ ํšŒ์˜์‹ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํšŒ์˜์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ์•„๋ณด์ž. ๋‹จ, ํšŒ์˜๋Š” ํ•œ๋ฒˆ ์‹œ์ž‘ํ•˜๋ฉด ์ค‘๊ฐ„์— ์ค‘๋‹จ๋  ์ˆ˜ ์—†์œผ๋ฉฐ ํ•œ ํšŒ์˜๊ฐ€ ๋๋‚˜๋Š” ๊ฒƒ๊ณผ ๋™์‹œ์— ๋‹ค์Œ ํšŒ์˜๊ฐ€ ์‹œ์ž‘๋  ์ˆ˜ ์žˆ๋‹ค. ํšŒ์˜์˜ ์‹œ์ž‘์‹œ๊ฐ„๊ณผ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๊ฐ™์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ์‹œ์ž‘ํ•˜์ž๋งˆ์ž ๋๋‚˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
์ž…๋ ฅ ์ฒซ์งธ ์ค„์— ํšŒ์˜์˜ ์ˆ˜ N(1 ≤ N ≤ 100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N+1 ์ค„๊นŒ์ง€ ๊ฐ ํšŒ์˜์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ ์ด๊ฒƒ์€ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ํšŒ์˜์˜ ์‹œ์ž‘์‹œ๊ฐ„๊ณผ ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ์ฃผ์–ด์ง„๋‹ค. ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ๋๋‚˜๋Š” ์‹œ๊ฐ„์€ 231-1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ ๋˜๋Š” 0์ด๋‹ค.
์ถœ๋ ฅ ์ฒซ์งธ ์ค„์— ์ตœ๋Œ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํšŒ์˜์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ํšŒ์˜๊ฐ€ ๋นจ๋ฆฌ ๋๋‚˜๋Š” ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ๋’ค ์ตœ๋Œ€ํ•œ ๋งŽ์€ ํšŒ์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ•ด์•ผ ํ•จ.
  • ๋๋‚˜๋Š” ์‹œ๊ฐ„์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ → ์‹œ์ž‘ํ•˜๋Š” ์‹œ๊ฐ„์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ
  • Python์˜ sort๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
    • 1. (2๋ฒˆ sort) ์ „์ฒด๋ฅผ ์‹œ์ž‘ ์‹œ๊ฐ„์˜ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ → ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ๋๋‚˜๋Š” ์‹œ๊ฐ„์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
    • 2. (1๋ฒˆ sort) key์— ํŠœํ”Œ๋กœ ์—ฌ๋Ÿฌ ์ธ์ž๋ฅผ ์ฃผ์–ด ํ•œ ๋ฒˆ์— ์ •๋ ฌ โ˜…
n = int(input()) # ํšŒ์˜์˜ ๊ฐœ์ˆ˜
time = [[0]*2 for i in range(n)] # ํšŒ์˜ ์‹œ๊ฐ„ 2์ฐจ์› ๋ฐฐ์—ด ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”

for i in range(n): # ํšŒ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ž…๋ ฅ๋ฐ›๊ธฐ
    time[i] = list(map(int, input().split()))

# 1์ˆœ์œ„ : ๋๋‚˜๋Š” ์‹œ๊ฐ„(์˜ค๋ฆ„์ฐจ์ˆœ), 2์ˆœ์œ„ : ์‹œ์ž‘ํ•˜๋Š” ์‹œ๊ฐ„(์˜ค๋ฆ„์ฐจ์ˆœ)
time = sorted(time, key = lambda x: (x[1], x[0]))

count = 1 # ํ˜„์žฌ ํšŒ์˜ ์ˆ˜ ์ €์žฅ. ์ตœ์†Œ 1๋ฒˆ์€ ํšŒ์˜ ์ง„ํ–‰
end = time[0][1] # ์ฒซ ๋ฒˆ์งธ ํšŒ์˜๊ฐ€ ๋๋‚˜๋Š” ์‹œ๊ฐ„
    
for i in range(1, n):
    if time[i][0] >= end: # ๋‹ค์Œ ํšŒ์˜๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด
        count += 1
        end = time[i][1] # ๋‹ค์Œ ํšŒ์˜๊ฐ€ ๋๋‚˜๋Š” ์‹œ๊ฐ„ ๊ฐฑ์‹ 

print(count)
728x90
320x100