관리 메뉴

πŸ’»πŸ’­πŸŽ§πŸŒ

BOJ 1461 : λ„μ„œκ΄€ (Python) λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€ 풀이

BOJ 1461 : λ„μ„œκ΄€ (Python)

adorableco 2023. 2. 15. 13:26
λ°˜μ‘ν˜•

 

문제

https://www.acmicpc.net/problem/1461

 

1461번: λ„μ„œκ΄€

μ„Έμ€€μ΄λŠ” λ„μ„œκ΄€μ—μ„œ μΌν•œλ‹€. λ„μ„œκ΄€μ˜ κ°œλ°©μ‹œκ°„μ΄ λλ‚˜μ„œ μ„Έμ€€μ΄λŠ” μ‚¬λžŒλ“€μ΄ 마ꡬ 놓은 책을 λ‹€μ‹œ κ°€μ Έλ‹€ 놓아야 ν•œλ‹€. μ„Έμ€€μ΄λŠ” ν˜„μž¬ 0에 있고, μ‚¬λžŒλ“€μ΄ 마ꡬ 놓은 책도 μ „λΆ€ 0에 μžˆλ‹€. 각 μ±…

www.acmicpc.net

 

 

μ½”λ“œ

ν’€μ΄μ˜ λ…Όλ¦¬λŠ” λ§žμœΌλ‚˜ ν‹€λ¦° μ½”λ“œμ΄λ‹€. ν‹€λ¦° μ΄μœ μ™€ μ •λ‹΅ μ½”λ“œλŠ” κ°€μž₯ μ•„λž˜μ—μ„œ !

import sys
from collections import deque
n, k = map(int,sys.stdin.readline().split())
init = list(map(int,sys.stdin.readline().split()))

init.sort()
array = deque(init)

count = 0
pivot = -1
diff = max(abs(array[0]),abs(array[len(array)-1]))

for i in range(len(array)-1):
    if array[i]<0 and array[i+1]>0:
        pivot = i
        break
        
i = len(array)-1
    
while i > pivot:
    count += abs(array[len(array)-1]) * 2
    for j in range(k):
        i -= 1
        array.pop()
        if i<=pivot:
            break
i = 0

while i <= pivot:
    count += abs(array[0]) * 2
    
    for j in range(k):
        i += 1
        array.popleft()
        if i > pivot:
            break
print(count-diff)

 

 

풀이

 

init λ¦¬μŠ€νŠΈμ— μ±… μœ„μΉ˜ 값을 λ„£μ–΄μ„œ sort ν•œλ‹€. 그리고  init 리슀트λ₯Ό deque 둜 λ³€ν™˜ν•œ 것이 array이닀.

→ pop()κ³Ό popleft()λ₯Ό μ΄μš©ν•˜κΈ° μœ„ν•΄μ„œ

 

β€» ꡳ이 popleft()λ₯Ό μ“°κΈ° μœ„ν•΄ deque으둜 λ³€ν™˜ν•˜κΈ° λ³΄λ‹€λŠ” 음수, μ–‘μˆ˜ 리슀트λ₯Ό λ‚˜λˆ„μ–΄μ„œ μ–‘μˆ˜λŠ” sortλ₯Ό reverse둜 ν•˜λ©΄ 더 μ΄ν•΄ν•˜κΈ° μ‰¬μšΈ 것 κ°™λ‹€.

 

# pivot = -1 (pivot μ΄ˆκΈ°κ°’μ€ -1둜 μ„€μ •)

for i in range(len(array)-1):
    if array[i]<0 and array[i+1]>0:
        pivot = i
        break

μŒμˆ˜μ™€ μ–‘μˆ˜λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄μ„œ pivot 값을 μ„€μ •ν•œλ‹€.

예λ₯Ό λ“€μ–΄ λ¦¬μŠ€νŠΈμ— -5 -4 -3 6 7 이 있으면 pivot은 2(-3이 μžˆλŠ” 인덱슀)κ°€ λœλ‹€. → μ•ž 숫자의 인덱슀λ₯Ό κΈ°μ€€μœΌλ‘œ 함

 

diff = max(abs(array[0]),abs(array[len(array)-1]))

κ°€μž₯ 멀리 μžˆλŠ” 책은 μ™•λ³΅ν•˜λ©΄ μ†ν•΄μ΄λ―€λ‘œ λ§ˆμ§€λ§‰μ— μ •λ¦¬ν•˜κ³  λλ‚΄λŠ” 것이 이득이닀.

κ·Έλž˜μ„œ μ΄ˆκΈ°μ— diff λ³€μˆ˜μ— array μ€‘μ—μ„œ μ ˆλŒ“κ°’μ΄ κ°€μž₯ 큰 값을 μ €μž₯ν•΄λ‘”λ‹€. 

arrayλŠ” 정렬이 돼 μžˆλŠ” μƒνƒœμ΄λ―€λ‘œ κ°€μž₯ μ™Όμͺ½μ˜ μ ˆλŒ“κ°’κ³Ό κ°€μž₯ 였λ₯Έμͺ½μ˜ μ ˆλŒ“κ°’λ§Œ 비ꡐλ₯Ό ν•˜λ©΄ λœλ‹€.

 

i = len(array)-1
    
while i > pivot:
    count += abs(array[len(array)-1]) * 2
    for j in range(k):
        i -= 1
        array.pop()
        if i<=pivot:
            break

λ¨Όμ € pivot의 였λ₯Έμͺ½μ— μžˆλŠ” μ˜μ—­λΆ€ν„° μ‹œμž‘ν•œλ‹€. (μ–‘μˆ˜ μ˜μ—­)

κ°€μž₯ 였λ₯Έμͺ½μ—μ„œλΆ€ν„° μ™Όμͺ½μœΌλ‘œ μ§„ν–‰λœλ‹€.

count 에 ν•΄λ‹Ή μΈλ±μŠ€μ— μžˆλŠ” μ›μ†Œμ˜ μ ˆλŒ“κ°’μ„ μ €μž₯ν•œ ν›„ for문을 μ΄μš©ν•΄ 세쀀이가 λ“€ 수 μžˆλŠ” μ±… ꢌ수만큼의 μ›μ†Œλ₯Ό νŒ¨μŠ€ν•œλ‹€.

→ 더 멀리 μžˆλŠ” 책을 꽂아두고 μ›μ μœΌλ‘œ λŒμ•„μ˜€λŠ” 길에 ν•¨κ»˜ λ“€κ³  온 책듀을 μ •λ¦¬ν•˜λ©΄μ„œ 올 수 있기 λ•Œλ¬Έμ΄λ‹€.

 

 

pivot의 μ™Όμͺ½μ— μžˆλŠ” μ˜μ—­λ„ λ§ˆμ°¬κ°€μ§€λ‘œ μ§„ν–‰ν•œλ‹€. (음수 μ˜μ—­)

μ΄λ²ˆμ—λŠ” κ°€μž₯ μ™Όμͺ½μ—μ„œλΆ€ν„° 였λ₯Έμͺ½μœΌλ‘œ μ§„ν–‰ν•œλ‹€. → μ ˆλŒ“κ°’μ΄ 큰 μˆœμ„œλŒ€λ‘œμž„

 

 

μœ„ μ½”λ“œκ°€ ν‹€λ¦° μ΄μœ μ™€ μ •λ‹΅ μ½”λ“œ

import sys
from collections import deque
n, k = map(int,sys.stdin.readline().split())

init = list(map(int,sys.stdin.readline().split()))
init.sort()
array = deque(init)

count = 0
pivot = -1
diff = max(abs(array[0]),abs(array[len(array)-1]))

for i in range(len(array)-1):
    if array[i]<0 and array[i+1]>0:
        pivot = i
        break


i = len(array)-1

#μ•„λž˜μ˜ if문을 λ„£μ–΄μ€˜μ•Ό 였λ₯˜ λ°œμƒ X
if pivot== -1 and array[0] < 0:
    pivot = len(array)-1
    
while i > pivot:
    count += abs(array[len(array)-1]) * 2
    for j in range(k):
        i -= 1
        array.pop()
        if i<=pivot:
            break

i = 0

while i <= pivot:
    count += abs(array[0]) * 2
        
    for j in range(k):
        i += 1
        array.popleft()
        if i > pivot:
            break

print(count-diff)

 μ „체 μˆ«μžκ°€ 음수인 κ²½μš°μ—μ„œ μ›λž˜ μ½”λ“œλΌλ©΄ pivot은 -1둜 κ·ΈλŒ€λ‘œ λ‚¨μ•„μžˆμ–΄μ„œ while i > pivot 을 κ±°μ³μ•Όν•˜λŠ”λ° 이 while문은 μ›λž˜ μ–‘μˆ˜ μœ„μΉ˜λ“€μ„ μœ„ν•œ κ²ƒμ΄λ―€λ‘œ 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ μ§„ν–‰ν•œλ‹€. 이에 λ°˜ν•΄ μŒμˆ˜λ“€μ€ μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ μ§„ν–‰ν•΄μ•Όν•˜λ―€λ‘œ 였λ₯˜κ°€ λ°œμƒν•œ 것이닀.

 κ·Έλž˜μ„œ pivot 이 -1 이고 array의 첫 μ›μ†Œκ°€ 음수라면 (== μ±…μ˜ μœ„μΉ˜κ°€ λͺ¨λ‘ 음수라면) pivot을 len(array)-1 둜 λ³€κ²½ν•΄μ„œ 첫번째 while문을 κ±°μΉ˜μ§€ μ•Šκ³  μ•„λž˜μ˜ whileλ¬Έμ—μ„œ 진행할 수 μžˆλ„λ‘ ν•œλ‹€.

λ°˜μ‘ν˜•