Algorithm Problem/Python

[python] λ°±μ€€ - 1655. κ°€μš΄λ°λ₯Ό λ§ν•΄μš”

deo2kim 2020. 11. 5. 08:07
λ°˜μ‘ν˜•

πŸ€”λ¬Έμ œ ν•΄κ²°

  • G2 | μš°μ„ μˆœμœ„ 큐

μ²˜μŒμ—λŠ” κ°€λ³κ²Œ μ •λ ¬λ‘œ ν’€μ—ˆμ§€λ§Œ, μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν–ˆλ‹€. ( λ°”μ΄λ„ˆλ¦¬μ„œμΉ˜λŠ” 톡과 λœλ‹€κ³  함 )

κ°€μš΄λ° κ°’ κ΅¬ν•˜κΈ°λ₯Ό μ—΄μ‹¬νžˆ μ°Ύμ•„λ΄€μ§€λ§Œ μ—†μ—ˆλ‹€. μ–΄μ©” 수 μ—†λ‹€.

 

이 문제의 μ˜λ„λŠ” μš°μ„ μˆœμœ„ 큐λ₯Ό ν™œμš©ν•˜λŠ” 것이닀.

파이썬의 νž™ν λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λ©΄ λ˜λŠ”λ°, μ΅œμ†Œνž™ κΈ°μ€€μœΌλ‘œ λ˜μ–΄μžˆλ‹€.

μ΅œμ†Œνž™μ€ κ°€μž₯ μž‘μ€ μ›μ†Œκ°€ λ£¨νŠΈμ— μœ„μΉ˜ν•˜λŠ” 것이닀.

μš°λ¦¬λŠ” κ°€μš΄λ° 값을 μ°Ύμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— νž™μ„ λ‘κ°œ λ§Œλ“€μ–΄μ„œ

μ™Όμͺ½μ˜ κ°€μž₯ 큰 μˆ˜μ™€ 였λ₯Έμͺ½μ˜ κ°€μž₯ μž‘μ€ 수λ₯Ό λΉ„κ΅ν•˜μ—¬ κ°€μš΄λ° 값을 ꡬ할 것이닀.

μ΄λ ‡κ²Œ 두 λΆ€λΆ„μœΌλ‘œ λ‚˜λˆ„λ©΄ κ°€μš΄λ° 값을 ꡬ ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ!!!!!!!!!!! μ΅œμ†Œνž™μœΌλ‘œ νž™ν λͺ¨λ“ˆμ΄ κ΅¬μ„±λ˜μ–΄ μžˆμœΌλ―€λ‘œ, μ™Όμͺ½μ˜ ꡬ성은 음수λ₯Ό λΆ™μ—¬μ„œ 거꾸둜 λ§Œλ“€μ–΄μ•Όν•œλ‹€.

μ΄λ ‡κ²Œ ν•˜λ©΄ μ™Όμͺ½μ˜ 0번과 였λ₯Έμͺ½μ˜ 0λ²ˆμ„ 비ꡐ할 수 μžˆλ‹€. (λ‹Ήμ—°νžˆ κΊΌλ‚Ό λ•ŒλŠ” -λ₯Ό λ‹€μ‹œ λΆ™μ—¬μ€€λ‹€.)

πŸ’»μ†ŒμŠ€ μ½”λ“œ

import sys
import heapq

input = sys.stdin.readline


def push_heap(left_heap: list, right_heap: list, num: int, n: int):
    # 숫자의 κ°œμˆ˜κ°€ ν™€μˆ˜μ΄λ©΄ 였λ₯Έμͺ½μ— λ„£κ³ , 짝수면 μ™Όμͺ½μ— λ„£κΈ°
    if n % 2 == 1:
        heapq.heappush(right_heap, num)
    else:
        heapq.heappush(left_heap, -num)


def make_mid_heap(left_heap: list, right_heap: list):
    # λ ˆν”„νŠΈμ˜ μ΅œλŒ€κ°’μ΄ 라이트의 μ΅œμ†Œκ°’λ³΄λ‹€ 크면 μœ„μΉ˜ κ΅ν™˜
    if left_heap:  # 라이트만 μžˆμ„ 수 있기 λ•Œλ¬Έμ— ifλ¬Έ 처리
        left_max = -left_heap[0]
        right_min = right_heap[0]
        if left_max > right_min:
            heapq.heappush(left_heap, -heapq.heappop(right_heap))
            heapq.heappush(right_heap, -heapq.heappop(left_heap))


def get_mid_number(left_heap: list, right_heap: list, n: int) -> int:
    # 숫자의 κ°œμˆ˜κ°€ ν™€μˆ˜μ΄λ©΄, λΌμ΄νŠΈμ—μ„œ μ΅œμ†Œκ°’μ„ λ°˜ν™˜
    # 숫자의 κ°œμˆ˜κ°€ 짝수이면, λ ˆν”„νŠΈ μ΅œλŒ€μ™€ 라이트 μ΅œμ†Œλ₯Ό λΉ„κ΅ν•˜μ—¬ μ΅œμ†Œκ°’ λ°˜ν™˜
    if n % 2 == 1:
        return right_heap[0]
    else:
        return min(-left_heap[0], right_heap[0])


if __name__ == '__main__':
    N = int(input())  # 숫자의 개수
    left_numbers = []  # μ΅œλŒ€ νž™(μ΅œλŒ€κ°’μ„ 음수둜 λ„£μ–΄ μ΅œλŒ€κ°’μ΄ 0λ²ˆμ— 였게 ν•œλ‹€)
    right_numbers = []  # μ΅œμ†Œ νž™

    for i in range(1, N + 1):
        number = int(input())
        push_heap(left_numbers, right_numbers, number, i)
        make_mid_heap(left_numbers, right_numbers)
        answer = get_mid_number(left_numbers, right_numbers, i)
        print(answer)
 

 

πŸ“•λ¬Έμ œ 확인

좜처: BACKJOON ONLINE JUDGE

링크: https://www.acmicpc.net/problem/1655

 

1655번: κ°€μš΄λ°λ₯Ό λ§ν•΄μš”

첫째 μ€„μ—λŠ” μˆ˜λΉˆμ΄κ°€ μ™ΈμΉ˜λŠ” μ •μˆ˜μ˜ 개수 N이 주어진닀. N은 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. κ·Έ λ‹€μŒ N쀄에 κ±Έμ³μ„œ μˆ˜λΉˆμ΄κ°€ μ™ΈμΉ˜λŠ” μ •μˆ˜κ°€ μ°¨λ‘€λŒ€λ‘œ 주어진닀. μ •μˆ˜λŠ” -1

www.acmicpc.net

λ°˜μ‘ν˜•