티스토리 뷰
https://www.acmicpc.net/problem/11286
문제생각
문제에서 적어놓은 것처럼 힙 자료구조를 사용해야하는 문제였습니다.
그래서 저는 파이썬의 heapq 모듈을 사용하였습니다.
하지만 이 문제는 단순히 heap 자료구조를 그대로 사용하면 안되는 것입니다.
문제에서 입력받는 수의 범위에는 음수도 포함되어있고 출력해야하는 값이 절댓값이 가장 작은 값을 출력해야되기 때문입니다. 또한 절댓값이 가장 작은 수가 여러개일 경우(-1, 1)에는 둘 중에 작은 값을 출력해야 합니다.
일단 파이썬의 heapq 모듈은 기본적으로 최소힙으로 동작합니다. 이 뜻은 heappop()을 할 때마다 최소값이 뽑힌다는 뜻입니다. 그래서 절댓값이 가장 작은 수가 여러개일 경우에 작은 값을 출력해야하는 경우는 해결되었습니다.
만약 입력으로 -2와 1이 입력되어있다고 가정하겠습니다. 이 때 기본적으로 heappop()을 한다면 당연히 -2가 뽑힐 것입니다. 하지만 문제에서는 절댓값이 가장 작은 값을 뽑으라고 했으니 1이 뽑혀야지 정상적으로 동작하는 것입니다.
따라서 이 문제에서는 입력과 동시에 우선순위를 줘야합니다.
그럼 우선순위를 어떻게 줘야할까요?
저는 입력값의 절댓값을 우선순위로 주었습니다. 그럼 (2, -2), (1, 1) 이렇게 heap에 저장이 될 것이고 1의 우선순위가 더 높기에 1이 먼저 출력될 것입니다.
#heapq 모듈에서 우선순위 큐 만들기
heappush(heap, (1, 입력값))
=> 입력을 튜플의 형태로하되 첫번째 인자를 우선순위로 사용할 수 있습니다.
문제코드
from heapq import heappush, heappop
import sys
import queue
input=sys.stdin.readline
n=int(input())
heap=[]
for i in range(n):
x=int(input())
if x!=0:
#heap에 튜플에 형태로 push하면 튜플의 첫번째 원소가 우선순위의 기준이 된다.
#그래서 입력의 절댓값을 넣어줌으로써 우선순위를 줬다.
heappush(heap, (abs(x), x))
else:
if len(heap)==0:
print(0)
else:
print(heappop(heap)[1])
'코딩테스트 > 백준' 카테고리의 다른 글
백준-2477(파이썬) (0) | 2022.10.12 |
---|---|
백준-15686(파이썬) (1) | 2022.10.11 |
백준-16926(파이썬) (0) | 2022.10.10 |
백준-2023(파이썬) (0) | 2022.10.09 |
백준-12891(파이썬) (0) | 2022.10.02 |
- Total
- Today
- Yesterday
- 자바
- querydsl
- list
- Spring
- 백엔드#게시판
- 4673번
- 회고
- 대충 만든 자판
- 서블릿#Servlet
- 스프링
- 오류
- springboot
- 백준#서강근육맨#20300
- 11659
- 파이썬
- 백준#잃어버린 괄호#1541
- MVC
- 덧칠하기
- 1316번
- arraylist
- 7568
- 1978
- 프로그래머스
- controller
- HTTP#HTTP특징
- 사탕 게임#백준#3085
- 게시판#자바#JPA#Entity
- java
- 백준
- this()
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |