πŸ”΅Coding Test/Algorithm

[ 이것이 μ½”λ”©ν…ŒμŠ€νŠΈλ‹€ with 파이썬 ] Greedy 기좜문제

🐢 개발개발 🐾 2022. 6. 16. 19:23

1. λͺ¨ν—˜κ°€ κΈΈλ“œ 

 λ¬Έμ œ

ν•œ λ§ˆμ„μ— λͺ¨ν—˜κ°€κ°€ Nλͺ… μžˆμŠ΅λ‹ˆλ‹€. λͺ¨ν—˜κ°€ κΈΈλ“œμ—μ„œλŠ” Nλͺ…μ˜ λͺ¨ν—˜κ°€λ₯Ό λŒ€μƒμœΌλ‘œ '곡포도'λ₯Ό μΈ‘μ •ν–ˆλŠ”λ°, '곡포도'κ°€ 높은 λͺ¨ν—˜κ°€λŠ” μ‰½κ²Œ 곡포λ₯Ό 느껴 μœ„ν—˜ μƒν™©μ—μ„œ μ œλŒ€λ‘œ λŒ€μ²˜ν•  λŠ₯λ ₯이 λ–¨μ–΄μ§‘λ‹ˆλ‹€.

λͺ¨ν—˜κ°€ κΈΈλ“œμž₯인 λ™λΉˆμ΄λŠ” λͺ¨ν—˜κ°€ 그룹을 μ•ˆμ „ν•˜κ²Œ κ΅¬μ„±ν•˜κ³ μž 곡포도가 X인 λͺ¨ν—˜κ°€λŠ” λ°˜λ“œμ‹œ Xλͺ… μ΄μƒμœΌλ‘œ κ΅¬μ„±ν•œ λͺ¨ν—˜κ°€ 그룹에 μ°Έμ—¬ν•΄μ•Ό 여행을 λ– λ‚  수 μžˆλ„λ‘ κ·œμ •ν–ˆμŠ΅λ‹ˆλ‹€. λ™λΉˆμ΄λŠ” νšŒλŒ€ λͺ‡ 개의 λͺ¨ν—˜κ°€ 그룹을 λ§Œλ“€ 수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

 

** λͺ¨λ“  λͺ¨ν—˜κ°€λ₯Ό νŠΉμ •ν•œ 그룹에 넣을 ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€. ** 

 

 μž…λ ₯쑰건 

- 첫째 쀄에 λͺ¨ν—˜κ°€μ˜ 수 N이 주어진닀. ( 1 ≤ N ≤ 100,000 )

- λ‘˜μ§Έ μ€„μ—λŠ” 각 λͺ¨ν—˜κ°€μ˜ 곡포도 값을 N μ΄ν•˜μ˜ μžμ—°μˆ˜λ‘œ 주어지며, 각 μžμ—°μˆ˜λŠ” 곡백으둜 κ΅¬λΆ„ν•©λ‹ˆλ‹€.

 

 μΆœλ ₯쑰건 

- 여행을 λ– λ‚  수 μžˆλŠ” κ·Έλ£Ή 수의 μ΅œλŒ“κ°’μ„ 좜λ ₯ν•©λ‹ˆλ‹€.

# λͺ¨ν—˜κ°€ κΈΈλ“œ
n = int(input())  # λͺ¨ν—˜κ°€μ˜ 수
arr = list(map(int, input().split()))  # λͺ¨ν—˜κ°€ κΈΈλ“œμ˜ 곡포도
arr.sort()
count= 0  # ν˜„μž¬ 그룹에 ν¬ν•¨λœ λͺ¨ν—˜κ°€ 수
result = 0 # 그룹 수

for i in arr:
    count += 1
    if count >= i:
        result += 1
        count = 0

print(result) # 총 κ·Έλ£Ή 수 좜λ ₯

2. κ³±ν•˜κΈ° ν˜Ήμ€ λ”ν•˜κΈ°

 λ¬Έμ œ

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

단, + 보닀 xλ₯Ό λ¨Όμ € κ³„μ‚°ν•˜λŠ” 일반적인 λ°©μ‹κ³ΌλŠ” 달리, λͺ¨λ“  연산은 μ™Όμͺ½μ—μ„œλΆ€ν„° μˆœμ„œλŒ€λ‘œ 이루어진닀고 κ°€μ •ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ 02984λΌλŠ” λ¬Έμžμ—΄μ΄ 주어지면, λ§Œλ“€μ–΄μ§ˆ 수 μžˆλŠ” κ°€μž₯ 큰 μˆ˜λŠ” ( ( ( ( 0 + 2 ) x 9 ) x 8 ) x 4 ) = 576 μž…λ‹ˆλ‹€.

λ˜ν•œ λ§Œλ“€μ–΄μ§ˆ 수 μžˆλŠ” κ°€μž₯ 큰 μˆ˜λŠ” 항상 20μ–΅ μ΄ν•˜μ˜ μ •μˆ˜κ°€ λ˜λ„λ‘ μž…λ ₯이 μ£Όμ–΄μ§‘λ‹ˆλ‹€.

 

 μž…λ ₯쑰건

- 첫째 쀄에 μ—¬λŸ¬ 개의 숫자둜 κ΅¬μ„±λœ ν•˜λ‚˜μ˜ λ¬Έμžμ—΄ Sκ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

 

 μΆœλ ₯쑰건

- 첫째 쀄에 λ§Œλ“€μ–΄μ§ˆ 수 μžˆλŠ” κ°€μž₯ 큰 수λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

# κ³±ν•˜κΈ° ν˜Ήμ€ λ”ν•˜κΈ°
s = input()
arr = []

for i in s:
    arr.append(int(i))

arr.sort()
result = arr[0]

for i in range(1, len(arr)):
    if arr[i] <= 1 or result <= 1:
        result += arr[i]
    else:
        result *= arr[i]

print(result)

3. λ¬Έμžμ—΄ 뒀집기

 λ¬Έμ œ

λ‹€μ†œμ΄λŠ” 0κ³Ό 1둜만 이루어진 λ¬Έμžμ—΄ Sλ₯Ό 가지고 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μ†œμ΄λŠ” 이 λ¬Έμžμ—΄ S에 μžˆλŠ” λͺ¨λ“  숫자λ₯Ό μ „λΆ€ κ°™κ²Œ λ§Œλ“€λ €κ³  ν•©λ‹ˆλ‹€. λ‹€μ†œμ΄κ°€ ν•  수 μžˆλŠ” 행동은 Sμ—μ„œ μ—°μ†λœ ν•˜λ‚˜ μ΄μƒμ˜ 숫자λ₯Ό 작고 λͺ¨λ‘ λ’€μ§‘λŠ” κ²ƒμž…λ‹ˆλ‹€.

λ’€μ§‘λŠ” 것은 1을 0으둜, 0을 1둜 λ°”κΎΈλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄ S = 0001100 일 λ•Œ 

1) 전체λ₯Ό λ’€μ§‘μœΌλ©΄ 1110011

2) 4번째 λ¬ΈμžλΆ€ν„° 5번째 λ¬ΈμžκΉŒμ§€ λ’€μ§‘μœΌλ©΄ 1111111이 λ˜μ–΄μ„œ 두 λ²ˆλ§Œμ— λͺ¨λ‘ 같은 숫자둜 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ¬Έμžμ—΄ Sκ°€ μ£Όμ–΄μ‘Œμ„ λŒ€, λ‹€μ†œμ΄κ°€ ν•΄μ•Ό ν•˜λŠ” ν–‰λ™μ˜ μ΅œμ†ŒνšŸμˆ˜λ₯Ό 좜λ ₯ν•˜μ„Έμš”.

 

 μž…λ ₯쑰건

- μ²«μ§Έ 쀄에 0κ³Ό 1둜만 이루어진 λ¬Έμžμ—΄ Sκ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€. S의 κΈΈμ΄λŠ” 100λ§Œλ³΄λ‹€ μž‘μŠ΅λ‹ˆλ‹€.

 

 μΆœλ ₯쑰건

- 첫째 쀄에 λ‹€μ†œμ΄κ°€ ν•΄μ•Όν•˜λŠ” ν–‰λ™μ˜ μ΅œμ†ŒνšŸμˆ˜λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

# λ¬Έμžμ—΄ 뒀집기
# 경우의 수λ₯Ό μƒκ°ν•΄μ„œ 가정해보기

data = input()
count0 = 0 # μ „λΆ€ 0으둜 λ°”κΎΈλŠ” 경우
count1 = 0 # μ „λΆ€ 1둜 λ°”κΎΈλŠ” 경우

if data[0] == '1': # 1이면 0으둜 λ°”κΏ”μ•Όν•˜κΈ° λ•Œλ¬Έμ—
    count0 += 1
else:
    count1 += 1

for i in range(len(data)-1):
    if data[i] != data[i+1]:
        if data[i+1] == '1':
            count0 += 1
        else:
            count1 += 1

print(min(count0, count1))

4. λ§Œλ“€  수 μ—†λŠ” κΈˆμ•‘

 λ¬Έμ œ

동넀 편의점 주인인 λ™λΉˆμ΄λŠ” N개의 동전을 가지고 μžˆμŠ΅λ‹ˆλ‹€. 이 λ•Œ N개의 동전을 μ΄μš©ν•˜μ—¬ λ§Œλ“€ 수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘ 쀑 μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

 

예λ₯Ό λ“€μ–΄, N = 5이고, 각 동전이 각각 3원, 2원, 1원, 1원, 9μ›μ§œλ¦¬ (ν™”νλ‹¨μœ„) 동전이라고 κ°€μ •ν•©μ‹œλ‹€. 이 λ•Œ λ™λΉˆμ΄κ°€ λ§Œλ“€ 수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘ 쀑 μ΅œμ†Ÿκ°’μ€ 8μ›μž…λ‹ˆλ‹€.

 

또 λ‹€λ₯Έ μ˜ˆμ‹œλ‘œ, N = 3이고, 각 동전이 각각 3원, 5원, 7μ›μ§œλ¦¬ (ν™”νλ‹¨μœ„) 동전이라고 κ°€μ •ν•©μ‹œλ‹€. μ΄λ•Œ λ™λΉˆμ΄κ°€ λ§Œλ“€ 수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘ 쀑 μ΅œμ†Ÿκ°’μ€ 1μ›μž…λ‹ˆλ‹€.

 

 μž…λ ₯쑰건

- 첫째 μ€„μ—λŠ” λ™μ „μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ–‘μ˜ μ •μˆ˜ N이 μ£Όμ–΄μ§‘λ‹ˆλ‹€. 

- λ‘˜μ§Έ μ€„μ—λŠ” 각 λ™μ „μ˜ 화폐 λ‹¨μœ„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” N개의 μžμ—°μˆ˜κ°€ 주어지며, 각 μžμ—°μˆ˜λŠ” 곡백으둜 κ΅¬λΆ„ν•©λ‹ˆλ‹€. 

 

 μΆœλ ₯쑰건

- 첫째 쀄에 주어진 λ™μ „λ“€λ‘œ λ§Œλ“€ 수 μ—†λŠ” μ–‘μ˜ μ •μˆ˜ κΈˆμ•‘ 쀑 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•©λ‹ˆλ‹€.

n = int(input())
data = list(map(int, input().split()))
data.sort()

target = 1
for x in data:
    if target < x:
        break
    target += x

print(target)

5. 볼링곡 κ³ λ₯΄κΈ°

 λ¬Έμ œ

A, B 두 μ‚¬λžŒμ΄ 볼링을 치고 μžˆμŠ΅λ‹ˆλ‹€. 두 μ‚¬λžŒμ€ μ„œλ‘œ λ¬΄κ²Œκ°€ λ‹€λ₯Έ 볼링곡을 κ³ λ₯΄λ €κ³  ν•©λ‹ˆλ‹€. 볼링곡은 총 Nκ°œκ°€ 있으며 각 λ³Όλ§κ³΅λ§ˆλ‹€ λ¬΄κ²Œκ°€ μ ν˜€μžˆκ³ , 곡의 λ²ˆν˜ΈλŠ” 1λ²ˆλΆ€ν„° μˆœμ„œλŒ€λ‘œ λΆ€μ—¬λ©λ‹ˆλ‹€.

λ˜ν•œ 같은 무게의 곡이 μ—¬λŸ¬ 개 μžˆμ„ 수 μžˆμ§€λ§Œ, μ„œλ‘œ λ‹€λ₯Έ 곡으둜 κ°„μ£Όν•©λ‹ˆλ‹€. 볼링곡의 λ¬΄κ²ŒλŠ” 1λΆ€ν„° MκΉŒμ§€μ˜ μžμ—°μˆ˜ ν˜•νƒœλ‘œ μ‘΄μž¬ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ N이 5이고 M이 3이며 각각의 λ¬΄κ²Œκ°€ μ°¨λ‘€λŒ€λ‘œ 1, 3, 2, 3, 2일 λ•Œ 각 곡의 λ²ˆν˜Έκ°€ μ°¨λ‘€λŒ€λ‘œ 1λΆ€ν„° 5λ²ˆκΉŒμ§€ λΆ€μ—¬λ©λ‹ˆλ‹€. 이 λ•Œ λ‘μ‚¬λžŒμ΄ κ³ λ₯Ό 수 μžˆλŠ” 볼링곡의 번호 쑰합을 κ΅¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 

결과적으둜 두 μ‚¬λžŒμ΄ 곡을 κ³ λ₯΄λŠ” 경우의 μˆ˜λŠ” 8가지 μž…λ‹ˆλ‹€. N개의 곡의 λ¬΄κ²Œκ°€ 각각 μ£Όμ–΄μ§ˆ λ•Œ, 두 μ‚¬λžŒμ΄ 볼링곡을 κ³ λ₯΄λŠ” 경우의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ„Έμš”.

 

 μž…λ ₯쑰건

- 첫째 쀄에 볼링곡의 개수 N, 곡의 μ΅œλŒ€ 무게 M이 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 각각 μžμ—°μˆ˜ ν˜•νƒœλ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

- λ‘˜μ§Έ 쀄에 각 볼링곡의 무게 Kκ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μˆœμ„œλŒ€λ‘œ μžμ—°μˆ˜ ν˜•νƒœλ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

 

 μΆœλ ₯쑰건

- 첫째 쀄에 두 μ‚¬λžŒμ΄ 볼링곡을 κ³ λ₯΄λŠ” 경우의 수λ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.

import itertools

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

arr = list(map(int, input().split()))
a = 0
b = 0

for i in itertools.combinations(arr, 2):
    if list(i)[0] == list(i)[1]:
        b += 1
    a += 1

print(a-b)

μ‹€μ œ μ½”ν…Œμ—μ„œ μ‘°ν•© 라이브러리λ₯Ό μ“Έ 수 μžˆλŠ”μ§€ λͺ¨λ₯΄κΈ°μ—  μ˜ˆμ‹œ λ‹΅μ•ˆλ„ μΆ”κ°€ν–ˆλ‹€. 

# 볼링곡 κ³ λ₯΄κΈ° λ‹΅μ•ˆ
n, m = map(int, input().split())
data = list(map(int, input().split()))

# 1λΆ€ν„° 10κΉŒμ§€ 무게λ₯Ό 담을 수 μžˆλŠ” 리슀트
array = [0] * 11

for x in data:
    # 각 λ¬΄κ²Œμ— ν•΄λ‹Ήν•˜λŠ” 볼링곡의 개수 카운트
    array[x] += 1

result = 0
# 1λΆ€ν„° mκΉŒμ§€μ˜ 각 λ¬΄κ²Œμ— λŒ€ν•˜μ—¬ 처리
for i in range(1, m+1):
    n -= array[i] # λ¬΄κ²Œκ°€ i인 볼링곡의 개수 (Aκ°€ 선택할 수 μžˆλŠ” 개수) μ œμ™Έ
    result += array[i] * n # Bκ°€ μ„ νƒν•˜λŠ” 경우의 μˆ˜μ™€ κ³±ν•˜κΈ°

print(result)

6. λ¬΄μ§€μ˜ λ¨Ήλ°© 라이브

 λ¬Έμ œ

ν‰μ†Œ μ‹μš•μ΄ μ™•μ„±ν•œ λ¬΄μ§€λŠ” μžμ‹ μ˜ 재λŠ₯을 뽐내고 μ‹Άμ–΄ 쑌고 κ³ λ―Ό 끝에 카카였 TV 라이브둜 방솑을 ν•˜κΈ°λ‘œ λ§ˆμŒλ¨Ήμ—ˆλ‹€.

κ·Έλƒ₯ 먹방을 ν•˜λ©΄ λ‹€λ₯Έ 방솑과 차별성이 μ—†κΈ° λ•Œλ¬Έμ— λ¬΄μ§€λŠ” μ•„λž˜μ™€ 같이 λ…νŠΉν•œ 방식을 μƒκ°ν•΄λƒˆλ‹€.

λ¬΄μ§€λŠ” λ‹€μŒκ³Ό 같은 λ°©λ²•μœΌλ‘œ μŒμ‹μ„ μ„­μ·¨ν•œλ‹€.

 

  • λ¬΄μ§€λŠ” 1번 μŒμ‹λΆ€ν„° λ¨ΉκΈ° μ‹œμž‘ν•˜λ©°, νšŒμ „νŒμ€ λ²ˆν˜Έκ°€ μ¦κ°€ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μŒμ‹μ„ 무지 μ•žμœΌλ‘œ κ°€μ Έλ‹€ λ†“λŠ”λ‹€.
  • λ§ˆμ§€λ§‰ 번호의 μŒμ‹μ„ μ„­μ·¨ν•œ ν›„μ—λŠ” νšŒμ „νŒμ— μ˜ν•΄ λ‹€μ‹œ 1번 μŒμ‹μ΄ 무지 μ•žμœΌλ‘œ μ˜¨λ‹€.
  • λ¬΄μ§€λŠ” μŒμ‹ ν•˜λ‚˜λ₯Ό 1초 λ™μ•ˆ μ„­μ·¨ν•œ ν›„ 남은 μŒμ‹μ€ κ·ΈλŒ€λ‘œ 두고, λ‹€μŒ μŒμ‹μ„ μ„­μ·¨ν•œλ‹€.
  • λ‹€μŒ μŒμ‹μ΄λž€, 아직 남은 μŒμ‹ 쀑 λ‹€μŒμœΌλ‘œ μ„­μ·¨ν•΄μ•Ό ν•  κ°€μž₯ κ°€κΉŒμš΄ 번호의 μŒμ‹μ„ λ§ν•œλ‹€.
  • νšŒμ „νŒμ΄ λ‹€μŒ μŒμ‹μ„ 무지 μ•žμœΌλ‘œ κ°€μ Έμ˜€λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ μ—†λ‹€κ³  κ°€μ •ν•œλ‹€.

무지가 먹방을 μ‹œμž‘ν•œ 지 K 초 후에 λ„€νŠΈμ›Œν¬ μž₯μ• λ‘œ 인해 방솑이 μž μ‹œ μ€‘λ‹¨λ˜μ—ˆλ‹€.

λ¬΄μ§€λŠ” λ„€νŠΈμ›Œν¬ 정상화 ν›„ λ‹€μ‹œ 방솑을 μ΄μ–΄κ°ˆ λ•Œ, λͺ‡ 번 μŒμ‹λΆ€ν„° μ„­μ·¨ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œκ³ μž ν•œλ‹€.

각 μŒμ‹μ„ λͺ¨λ‘ λ¨ΉλŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ΄ λ‹΄κ²¨μžˆλŠ” λ°°μ—΄ food_times, λ„€νŠΈμ›Œν¬ μž₯μ• κ°€ λ°œμƒν•œ μ‹œκ°„ K μ΄ˆκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ λͺ‡ 번 μŒμ‹λΆ€ν„° λ‹€μ‹œ μ„­μ·¨ν•˜λ©΄ λ˜λŠ”μ§€ return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜λΌ.

 

μ œν•œμ‚¬ν•­

 

  • food_times λŠ” 각 μŒμ‹μ„ λͺ¨λ‘ λ¨ΉλŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ΄ μŒμ‹μ˜ 번호 μˆœμ„œλŒ€λ‘œ λ“€μ–΄μžˆλŠ” 배열이닀.
  • k λŠ” 방솑이 μ€‘λ‹¨λœ μ‹œκ°„μ„ λ‚˜νƒ€λ‚Έλ‹€.
  • λ§Œμ•½ 더 μ„­μ·¨ν•΄μ•Ό ν•  μŒμ‹μ΄ μ—†λ‹€λ©΄ -1을 λ°˜ν™˜ν•˜λ©΄ λœλ‹€.

μ •ν™•μ„± ν…ŒμŠ€νŠΈ μ œν•œ 사항

 

  • food_times 의 κΈΈμ΄λŠ” 1 μ΄μƒ 2,000 μ΄ν•˜μ΄λ‹€.
  • food_times 의 μ›μ†ŒλŠ” 1 μ΄μƒ 1,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.
  • kλŠ” 1 μ΄μƒ 2,000,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

νš¨μœ¨μ„± ν…ŒμŠ€νŠΈ μ œν•œ 사항

 

  • food_times 의 κΈΈμ΄λŠ” 1 μ΄μƒ 200,000 μ΄ν•˜μ΄λ‹€.
  • food_times 의 μ›μ†ŒλŠ” 1 μ΄μƒ 100,000,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.
  • kλŠ” 1 μ΄μƒ 2 x 10^13 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

μž…μΆœλ ₯ 예

food_times [ 3, 1, 2 ]

k 5

result 1

 

  • 0~1초 λ™μ•ˆμ— 1번 μŒμ‹μ„ μ„­μ·¨ν•œλ‹€. 남은 μ‹œκ°„μ€ [2,1,2] 이닀.
  • 1~2초 λ™μ•ˆ 2번 μŒμ‹μ„ μ„­μ·¨ν•œλ‹€. 남은 μ‹œκ°„μ€ [2,0,2] 이닀.
  • 2~3초 λ™μ•ˆ 3번 μŒμ‹μ„ μ„­μ·¨ν•œλ‹€. 남은 μ‹œκ°„μ€ [2,0,1] 이닀.
  • 3~4초 λ™μ•ˆ 1번 μŒμ‹μ„ μ„­μ·¨ν•œλ‹€. 남은 μ‹œκ°„μ€ [1,0,1] 이닀.
  • 4~5초 λ™μ•ˆ (2번 μŒμ‹μ€ λ‹€ λ¨Ήμ—ˆμœΌλ―€λ‘œ) 3번 μŒμ‹μ„ μ„­μ·¨ν•œλ‹€. 남은 μ‹œκ°„μ€ [1,0,0] 이닀.
  • 5μ΄ˆμ—μ„œ λ„€νŠΈμ›Œν¬ μž₯μ• κ°€ λ°œμƒν–ˆλ‹€. 1번 μŒμ‹μ„ μ„­μ·¨ν•΄μ•Ό ν•  λ•Œ μ€‘λ‹¨λ˜μ—ˆμœΌλ―€λ‘œ, μž₯μ•  볡ꡬ 후에 1번 μŒμ‹λΆ€ν„° λ‹€μ‹œ λ¨ΉκΈ° μ‹œμž‘ν•˜λ©΄ λœλ‹€.
import heapq

def solution(food_times, k):
    # μŒμ‹μ„ λ‹€ 먹은 경우 더 먹을 것이 없을 λ•Œ
    if sum(food_times) <= k:
        return -1
    
    q = []
    for i in range(len(food_times)):
        # (μŒμ‹μ‹œκ°„, μŒμ‹ 번호) ν˜•νƒœλ‘œ μš°μ„ μˆœμœ„ 큐에 μ‚½μž…
        heapq.heappush(q, (food_times[i], i+1))
    sum_value = 0 # λ¨ΉκΈ° μœ„ν•΄ μ‚¬μš©ν•œ μ‹œκ°„ 
    previous = 0 # 직전에 λ‹€ 먹은 μŒμ‹ μ‹œκ°„
    length = len(food_times) # 남은 μŒμ‹ 개수
    
    while sum_value + ((q[0][0] - previous)*length) <= k:
        now = heapq.heappop(q)[0]
        sum_value += (now-previous) * length 
        length -= 1
        previous = now # 이전 μŒμ‹ μ‹œκ°„ μž¬μ„€μ • 
    
    result = sorted(q, key = lambda x : x[1]) # μŒμ‹ 번호 κΈ°μ€€μœΌλ‘œ μ •λ ¬ 
        
    return result[(k-sum_value)%length][1]