We will find a way, we always have.

-interstellar

Problem Solving/λ°±μ€€

[λ°±μ€€] 1654번: λžœμ„  자λ₯΄κΈ° - 파이썬

Redddy 2022. 5. 23. 01:13

🧩문제 해석

κ°–κ³  λžœμ„ λ“€μ„ k개의 같은 길이의 λžœμ„ μœΌλ‘œ 자λ₯΄λ˜, 자λ₯Έ λžœμ„ μͺΌκ°€λ¦¬λ“€μ€ λ‹€μ‹œ μ‚¬μš©ν•  수 μ—†λ‹€. μ΄λ•Œ λ§Œλ“€ 수 μžˆλŠ” μ΅œλŒ€ 길이의 λžœμ„ μ„ κ΅¬ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

 

πŸ“• 풀이

숫자 λ²”μœ„κ°€ μ‹¬μƒμΉ˜ μ•Šλ‹€. κ°–κ³  μžˆλŠ” λžœμ„ μ˜ μˆ˜κ°€ 백만개이고, λžœμ„ μ΄ κΈΈμ΄λŠ” 2^31-1 보닀 μž‘μ€ μžμ—°μˆ˜μ΄λ‹€.γ…Ž
일반적으둜 μ ‘κ·Όν–ˆλ‹€κ°€λŠ” μ‹œκ°„μ΄ˆκ³Όλ‚  것이 λΆ„λͺ…ν•˜λ‹€. 이 λ¬Έμ œλŠ” μ΄λΆ„νƒμƒ‰μœΌλ‘œ ν’€μ–΄μ•Ό ν•œλ‹€.

 

첫번째 아이디어!

  • 가지고 μžˆλŠ” λžœμ„ μ€‘ μ΅œμ†Œκ°’μ„ μ°ΎλŠ”λ‹€.
  • μ΅œμ†Œκ°’ λžœμ„ μ„ end 값에 두고 이뢄탐색을 ν•œλ‹€.
  • 탐색 값듀을 λ¦¬μŠ€νŠΈμ— μ €μž₯ν•˜κ³ , μ΅œμ’…μ μœΌλ‘œ κ·Έ 리슀트의 μ΅œλŒ€κ°’μ„ 좜λ ₯ν•œλ‹€.

 

μ΅œμ†Œκ°’λžœμ„ μ„ end 값에 λ‘” μ΄μœ λŠ” μ΅œλŒ€κ°’λžœμ„ μ„ end 값에 λ‘”λ‹€ ν•˜μ—¬λ„ κ²°κ΅­μ—λŠ” μ΅œμ†Œκ°’λžœμ„ μ— 올 것이라고 μƒκ°ν–ˆλ‹€.

λ¬Όλ‘  λ§žλŠ” 말이긴 ν•˜λ‹€. κ·ΈλŸ¬λ‚˜ μƒκ°ν•˜μ§€ λͺ»ν–ˆλ˜ λ°˜λ‘€κ°€ μžˆμ—ˆλ‹€. 

λ°”λ‘œ k의 값이닀. kλŠ” λ§Œλ“€κ³ μž ν•˜λŠ” λžœμ„ μ˜ κ°―μˆ˜λ‹€. λ§Œμ•½ kκ°€ 1이라면, λžœμ„ μ„ 자λ₯Ό ν•„μš”κ°€ μ—†κ³ , 가지고 μžˆλŠ” κ²ƒλ“€μ€‘μ—μ„œ κ°€μž₯ κΈ΄ λžœμ„ μ„ μ‚¬μš©ν•˜λ©΄ λœλ‹€!

κ·Έλž˜μ„œ μ΅œμ†Œκ°’λžœμ„ μ„ μ‚¬μš©ν•˜λ©΄ μœ„μ™€ 같은 경우의 μ²˜λ¦¬κ°€ μ–΄λ €μ›Œμ§„λ‹€.

 

 

λ‘λ²ˆμ§Έ 아이디어!

  • 가지고 μžˆλŠ” λžœμ„ μ€‘ μ΅œλŒ€κ°’μ„ μ°ΎλŠ”λ‹€.
  • μ΅œλŒ€κ°’ λžœμ„ μ„ end 값에 두고 이뢄탐색을 ν•œλ‹€.
  • 탐색 값듀을 λ¦¬μŠ€νŠΈμ— μ €μž₯ν•˜κ³ , μ΅œμ’…μ μœΌλ‘œ κ·Έ 리슀트의 μ΅œλŒ€κ°’μ„ 좜λ ₯ν•œλ‹€.

 

μ•žμ„  λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆλ‹€!

 

πŸ’» μ½”λ“œ

n, k = map(int, input().split())
# λžœμ„ μ˜ 길이 담은 리슀트
lan = [int(input()) for i in range(n)]
# κ°–κ³  μžˆλŠ” λžœμ„ μ€‘ μ΅œλŒ€κ°’
max_lan = max(lan)
# 후보ꡰ 담을 리슀트
res = []

def binary(k, start, end):
	# 이뢄탐색 μ‹œμž‘
    while start <= end:
        mid = (start + end) // 2
        cnt = 0
        for i in lan:
        	# ꡬ해진 κ°’μœΌλ‘œ λžœμ„ μ„ μž˜λΌλ³Έλ‹€
            cnt += i//mid
        # 자λ₯Έ λžœμ„ λ“€μ΄ k 보닀 μž‘λ‹€λ©΄ 쒀더 μž‘κ²Œ μž˜λΌμ•Όν•¨
        if cnt < k: 
        	end = mid - 1
        # 쑰건을 λ§Œμ‘±ν•˜λŠ” 경우.
        else:
        	# 후보에 λ„£κ³  쒀더 크게 λ§Œλ“€μ–΄λ΄„
            res.append(mid)
            start = mid + 1
# 이뢄탐색 ν•¨μˆ˜ 호좜
binary(k,1,max_lan)
# ν›„λ³΄κ΅°μ—μ„œ μ΅œλŒ€κ°’ 좜λ ₯
print(max(res))

 

πŸ”— 문제링크 : λžœμ„  자λ₯΄κΈ°

 

1654번: λžœμ„  자λ₯΄κΈ°

첫째 μ€„μ—λŠ” μ˜€μ˜μ‹μ΄ 이미 가지고 μžˆλŠ” λžœμ„ μ˜ 개수 K, 그리고 ν•„μš”ν•œ λžœμ„ μ˜ 개수 N이 μž…λ ₯λœλ‹€. KλŠ” 1이상 10,000μ΄ν•˜μ˜ μ •μˆ˜μ΄κ³ , N은 1이상 1,000,000μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. 그리고 항상 K ≦ N 이닀. κ·Έ

www.acmicpc.net