일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- dfs #bfs #트리구조 #이진트리 #leetcode #파이썬 #python
- leetcode #subsets #dfs #itertools #python
- 해시테이블 #heapq #파이썬 #리트코드 #알고리즘
- context #android #getApplicationContext #activity #생명주기 #lifecycle
- dfs #bfs #이진트리 #파이썬 #리트코드
- dfs #이진트리 #트리구조 #직렬화 #역직렬화 #파이썬 #리트코드 #leetcode #python
- dfs #python #leetcode #combination
- 2004 #조합 0의 개수 #백준
- 아스테리스크 #Asterisk #파이썬
- final #java #자바 #안드로이드
- dfs #bfs #트리구조 #이진트리 #leetcode #python #파이썬
- handler #looper #thread #runnable #핸들러 #루퍼 #스레드 #러너블
- Python #leetcode #dfs #그래프 #백트래킹
- 리트코드 #팰린드롬 #파이썬
- gcd #최대공약수 #백준 #2981 #검문
- AsyncTask #doinbackground #스레드 #thread #android #안드로이드
- dfs #bfs #leetcode #python
- dfs #python #leetcode
- dfs #그래프 #graph #python #leetcode #course #schedule
- dfs #leetcode #python #graph #그래프
- python #백준 #2580 #스도쿠 #dfs #백트래킹
- exoplayer #mediaplayer #엑소플레이어 #안드로이드 #android
- 코틀린 #Do it #깡샘 #안드로이드
- dfs #leetcode #python
- 파이썬 #zip
- 다익스트라 #dijkstra #leetcode #파이썬 #python #algorithm #787
- python #백준 #9375 #패션왕 #신해빈
- leetcode #python #dfs #재귀
- 백준 #파이썬 #bfs #백트래킹 #1697 #숨바꼭질
- 다익스트라 #알고리즘 #bfs #그리디 #다이나믹프로그래밍 #leetcode #python
- Today
- Total
멋진 개발자가 되고 싶다
[백준,Python] 1655. 가운데를 말해요 본문
문제
수빈이는 동생에게 "가운데를 말해요" 게임을 가르쳐주고 있다. 수빈이가 정수를 하나씩 외칠 때마다 동생은 지금까지 수빈이가 말한 수 중에서 중간값을 말해야 한다. 만약, 그동안 수빈이가 외친 수의 개수가 짝수개라면 중간에 있는 두 수 중에서 작은 수를 말해야 한다.
예를 들어 수빈이가 동생에게 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를 이용하여 한 곳에 다 때려 박고
중간값을 알아내기 위해 중간값이 나올 때까지 pop을 하였다.
그 결과 시간 초과가 떴고..
좀 더 효율적으로 계산해야 풀 수 있는 것이었다!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import sys
import heapq
N = int(sys.stdin.readline())
left_heap = []
right_heap = []
for _ in range(N):
val = int(sys.stdin.readline())
if len(left_heap) == len(right_heap):
heapq.heappush(left_heap, (-val, val))
else:
heapq.heappush(right_heap, (val, val))
if right_heap and left_heap[0][1] > right_heap[0][1]:
temp_a = heapq.heappop(left_heap)[1]
temp_b = heapq.heappop(right_heap)[1]
heapq.heappush(right_heap, (temp_a, temp_a))
heapq.heappush(left_heap, (-temp_b, temp_b))
print(left_heap[0][1])
|
cs |
해설:
이 문제는 중앙값을 찾는 문제다.
따라서 정수를 left_heap, right_heap으로 반반 나눌 것이다.
left_heap, right_heap 반띵을 제대로 해주려면 line 10~13처럼 처음엔 left_heap에 넣어주고
그다음에 right_heap에 넣어주는 방식으로 진행한다.
그 후 line 15의 if문처럼 left_heap에서 제일 큰 값, right_heap에서 제일 작은 값을 비교하여
left_heap에서의 값이 더 크면 잘못된 것이니까
line 16~19 과정을 통해 바꿔준다.
그 후 left_heap에서 제일 큰 값을 출력한다.
'Algorithm Study > 백준' 카테고리의 다른 글
[백준/Python] 1697. 숨바꼭질 (0) | 2021.07.30 |
---|---|
[백준/Python] 1012. 유기농 배추 (0) | 2021.07.25 |
[백준,Python] 1002. 터렛 (0) | 2021.07.18 |
[백준,Python] 9020. 골드바흐의 추측 (0) | 2021.07.17 |
[백준,Python] 17298. 오큰수 (0) | 2021.07.17 |