ZZIN33
re-code-cord
ZZIN33
전체 방문자
오늘
어제
  • 분류 전체보기 (52)
    • Paper (4)
      • Generative Model (2)
      • Segmentation (1)
      • 모델 경량화 (1)
    • Study (34)
      • AI (10)
      • MLOps (8)
      • CS (4)
      • OpenCV (1)
      • Algorithm (9)
      • ETC (2)
    • Project (6)
    • ETC (8)
      • 부스트캠프 AI Tech (2)
      • 도서 리뷰 (5)

블로그 메뉴

  • Home
  • About
  • Github

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ZZIN33

re-code-cord

[백준] 1655번 : 가운데를 말해요 (Python)
Study/Algorithm

[백준] 1655번 : 가운데를 말해요 (Python)

2021. 12. 6. 23:09

 문제는 간단하다. 숫자를 하나씩 받고 지금까지의 숫자들 중에서 중앙값을 답하면 된다. (단, 짝수의 경우 두 수 중에서 작은 값을 답해야 한다) 처음에는 정말 간단하게, sort()를 통해서 중앙값을 답하였으나, 역시나 시간 초과. 

 이를 해결하기 위해서는, 매번 중앙값을 찾기 위해서 sort()하는 과정을 생략해야 한다. 해결과정은 다음과 같다.

  • 숫자 리스트를 두 가지로 나누어서 생각한다. 왼쪽에는 작은 값들이, 오른쪽에는 큰 값들이 들어간다.
  • 왼쪽의 리스트에서 가장 큰 값은 중앙값이다.
  • 위의 조건이 만족하도록 숫자를 입력한다.

 숫자는 왼쪽, 오른쪽 번갈아가며 채우며, 왼쪽에 오른쪽보다 큰 숫자가 들어가는 경우 두 숫자를 교환한다. 즉, 왼쪽의 가장 큰 값과 오른쪽의 가장 작은 값을 비교한다. 이를 위해서, 왼쪽은 가장 큰 값이 루트가 되도록 max_heap, 오른쪽은 가장 작은 값이 루트가 되도록 min_heap으로 사용한다. 풀이한 코드는 다음과 같다.  

import sys
import heapq

# Let's keep the value of left root is the answer
cnt = int(sys.stdin.readline())
left, right = [], [] 

for i in range(cnt):
  num = int(sys.stdin.readline())
  
  # Fill in the numbers from the left
  if len(left) == len(right):
    heapq.heappush(left, (-num, num))
  else:
    heapq.heappush(right, (num, num))

  # Compare if left is bigger than right 
  if i > 0 and left[0][1] > right[0][1]:
    temp_l = heapq.heappop(left)[1]
    temp_r = heapq.heappop(right)[1]
    heapq.heappush(left, (-temp_r, temp_r))
    heapq.heappush(right, (temp_l, temp_l))

  print(left[0][1])

 

저작자표시 (새창열림)

'Study > Algorithm' 카테고리의 다른 글

[백준] 2578번 : 빙고 (Python)  (0) 2022.01.17
[프로그래머스] 가장 큰 수 (Python)  (0) 2021.12.05
[프로그래머스] 주식가격 (Python)  (0) 2021.12.02
[백준] 9663번 : N-Queen (Python)  (0) 2021.11.30
[백준] 5430번: AC (Python)  (1) 2021.11.29

    티스토리툴바