Thief of Wealth

문제

수빈이는 동생에게 "가운데를 말해요" 게임을 가르쳐주고 있다. 수빈이가 정수를 하나씩 외칠때마다 동생은 지금까지 수빈이가 말한 수 중에서 중간값을 말해야 한다. 만약, 그동안 수빈이가 외친 수의 개수가 짝수개라면 중간에 있는 두 수 중에서 작은 수를 말해야 한다.

예를 들어 수빈이가 동생에게 1, 5, 2, 10, -99, 7, 5를 순서대로 외쳤다고 하면, 동생은 1, 1, 2, 2, 2, 2, 5를 차례대로 말해야 한다. 수빈이가 외치는 수가 주어졌을 때, 동생이 말해야 하는 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -10,000보다 크거나 같고, 10,000보다 작거나 같다.

출력

한 줄에 하나씩 N줄에 걸쳐 수빈이의 동생이 말해야하는 수를 순서대로 출력한다

 

 

핵심 아이디어는 차례로 값을 넣으면서 크기순으로 정렬했을때 중간값을 추출하는 것이다.

heapq를 쓰면 힙으로 정렬되나 막상 출력해보면 정렬값으로 출력되지 않는다. (heapq로 해결하는 방법이 있다.)

그러나 무지막강한 파이썬에는 빌트인 라이브러리로 bisect라는 것을 제공한다.

 

bisect를 사용하면 입력을 넣으면 선형시간으로 즉시 입력값에 대해 정렬해주어서

입력값이 들어가면 sort를 해주는 것보다 훨씬 빠르게 정렬할 수 있다.

 

import sys
import bisect
input = sys.stdin.readline

n = int(input().rstrip())
x = []
answers = []
for _ in range(n):
    bisect.insort(x, int(input().rstrip()))
    if(len(x) % 2 == 0):
        answers.append(x[int(len(x)/2)-1])
    else:
        answers.append(x[int(len(x)/2)])

for a in answers:
    print(a)

'개발 > 알고리즘' 카테고리의 다른 글

[BOJ] 2075 N번째 큰수  (0) 2020.10.11
[BOJ] 1715 카드 정렬하기  (0) 2020.10.11
[BOJ] 11286 절댓값 힙  (0) 2020.10.11
[BOJ] 1927 최소힙, 11279 최대힙  (0) 2020.10.11
[BOJ] 4693 섬의개수  (0) 2020.10.10
profile on loading

Loading...