2/BOJ

백준 1655번 - 가운데를 말해요

하례은 2020. 10. 13. 00:29

www.acmicpc.net/problem/1655

 

1655번: 가운데를 말해요

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

www.acmicpc.net

 

1. 순차탐색

N = int(input())
answer = []
result = [0]*N

for i in range(N):
    n = int(input())
    answer.append(n)
    answer.sort()
    l = int(len(answer)/2)
    if len(answer)%2 == 1:
        result[i] = answer[l]

    else:
        result[i] = answer[l-1]

for i in range(len(answer)):
    print(result[i])

d이거 시간초과

 

 

2. 이진탐색

import bisect

N = int(input())
answer= []
result = [0]*N
for i in range(N):
    n = int(input())
    if len(answer) == 0:
        answer.append(n)
    else:
        index = bisect.bisect_left(answer,n)
        answer.insert(index,n)
    l = len(answer)//2
    if len(answer)%2 == 1:
        result[i] = answer[l]
    else:
        result[i] = answer[l-1]

for i in range(len(result)):
    print(result[i])

파이썬은 이진탐색 모듈 bisect을 제공해준다!!

 

3.힙(우선탐색 큐)

 

3_1

import heapq

N = int(input())
maxheap = []
minheap = []
for i in range(N):
    n = int(input())
    if len(minheap) == len(maxheap):
        heapq.heappush(maxheap, -n)
    else:
        heapq.heappush(minheap, n)

    if minheap and -maxheap[0] > minheap[0]:
        max_value = -heapq.heappop(maxheap)
        min_value = heapq.heappop(minheap)
        heapq.heappush(min_value, max_value)
        heapq.heappush(max_value, -min_value)
    
    print(-maxheap[0])

이건 런타임 에러난다.... 테스트 결과는 잘 맞는데 왜그런거지... 영 모르겠어서 다른 블로그를 참고해보니 튜플을 이용해서 최대힙을 구한걸 봤다..

 

3_2

import heapq
import sys
N = int(sys.stdin.readline())
maxheap = []
minheap = []
for _ in range(N):
    n = int(sys.stdin.readline())
    if len(minheap) == len(maxheap):
        heapq.heappush(maxheap, (-n,n))
    else:
        heapq.heappush(minheap, (n,n))

    if minheap and maxheap[0][1] > minheap[0][1]:
        max_value = heapq.heappop(maxheap)[1]
        min_value = heapq.heappop(minheap)[1]
        heapq.heappush(min_value, (max_value,max_value))
        heapq.heappush(max_value, (-min_value,min_value))
    
    print(maxheap[0][1])

이것도 런타임 에러..........와이.....y....

 

아무튼 한문제로 이진탐색과 힙을 다룰 수 있어서 좋았다.

'2 > BOJ' 카테고리의 다른 글

백준 11399, 5585번 - ATM, 거스름돈  (0) 2020.10.21
백준 2750, 2751번 - 수 정렬하기1, 2  (0) 2020.10.20
백준 1920번 - 수 찾기  (0) 2020.10.18
백준 11401번 - 이항계수3  (0) 2020.10.13
백준 12865번 - 평범한 배낭  (0) 2020.10.12