[boj] 1655번: 가운데를 말해요

2023. 1. 13. 15:24·Problem Solving/Baekjoon

출처 : https://www.acmicpc.net/problem/1655

 

1655번: 가운데를 말해요

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

www.acmicpc.net

 

 

 

1. 문제 설명 

백준이가 정수를 하나씩 외칠때마다 동생은 지금까지 백준이가 말한 수 중에서 중간 값을 말해야 한다. 만약 외친 수가 짝수개라면 중간에 있는 두 수 중에서 작은 수를 말한다.

1을 외치면 지금까지 `백준이가 외친 수 = [1]이므로 1
5를 외치면 `백준이가 외친 수 = [1,5], 두 수중 작은 수는 1
2를 외치면 `백준이가 외친 수 = [1,5,2] 중간 수는 2

위와 같은 방식으로 수를 구해야 한다.

 

 

 


2. 접근 방식

처음에는 힙 정렬을 사용하여 문제를 풀었는데, 시간 초과가 났다. TC에 대해서 생각하고 풀어야하는데 가끔 무지성으로 풀어버린다.. 우선순위 큐를 활용하여 최소 힙, 최대 힙 두 개를 만들었다. 양 쪽을 균형있게 채워넣으면서 if (left_heap and right_heap) 두 개의 힙이 비어있지 않고 right_heap[0] < -left_heap[0] 일 때, 각 힙의 값을 바꿔준다. 위와 같이, 바꿔주는 이유는 두 큐를 매번 비교해서 중간 값을 반환하지 않고 하나의 큐를 기준으로 매번 중간 값을 반환하기 위해서 거쳐야 하는 과정이다.

 

 

 


3. 주석 달기 (변수 설명, 각 줄마다 문장으로 설명, 함수 설명)

import heapq
import sys
input = sys.stdin.readline
T = int(input())
left_heap = []
right_heap = []
for _ in range(T):
    num = int(input())
    if len(left_heap) == len(right_heap):
        heapq.heappush(left_heap, -num)
    else:
        heapq.heappush(right_heap, num)

    if (left_heap and right_heap) and right_heap[0] < -left_heap[0]:
        left_tmp = heapq.heappop(left_heap)
        right_tmp = heapq.heappop(right_heap)
        heapq.heappush(left_heap, -right_tmp)
        heapq.heappush(right_heap, -left_tmp)

    print(-left_heap[0])

 

 


4. 분석

1. Time : python3에 주어진 시간은 0.6초이며, 대략 12 * 10^6의 연산을 허용한다.  n의 상한은 10^5, heap sort를 활용한 방법은 10^5 * Log 10^5이기 때문에 통과할 수 없다. 삽입/삭제 연산 O(logN)인 Priority Queue를 사용하여 문제를 해결하였다. 
2. Space :
3. 소요시간 : 1시간 
4. 제출 횟수 (무작정 제출하기 않기)  : 3회 
5. 어려웠던 부분과 해결한 방법 : 비슷한 유형을 꾸준히 반복적으로 풀고 복습하는 습관을 들여야할 것 같다. 
6. 실수가 줄어들었는가 ? 

'Problem Solving/Baekjoon' 카테고리의 다른 글
  • [boj] 1026번: 보물
  • [boj] 2630번: 색종이 만들기
  • [boj] 14620번: 꽃길
  • [boj] 22114번: 창영이와 점프
kimdozzi
kimdozzi
끝까지 포기하지 않으면, 내가 다 이겨!
  • kimdozzi
    도브로
    kimdozzi
  • 전체
    오늘
    어제
    • 분류 전체보기 (132)
      • Problem Solving (49)
        • Baekjoon (29)
        • Programmers (0)
        • LeetCode (17)
        • 삼성 유형 (2)
      • Computer Science (27)
        • Operating System (2)
        • Algorithms (13)
        • Network (6)
        • DataBase (6)
      • Backend (33)
        • JavaScript (0)
        • TypeScript (6)
        • Java (7)
        • Spring Boot (7)
        • Spring Security (6)
        • JPA (2)
        • Mybatis (1)
        • Junit5 (1)
        • Redis (3)
      • DevOps (14)
        • Git, Github (5)
        • docker (4)
        • AWS (3)
        • nginx (2)
      • etc (6)
        • IntelliJ (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 티스토리
    • 설정
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    도커
    인덱서블 타입
    segment tree
    티스토리챌린지
    TypeScript
    구간 업데이트
    파이썬
    오블완
    S3
    Bucket
    삼성기출
    온라인 쿼리
    인덱스 시그니처
    AWS
    인터페이스
    백준
    타입스크립트
    컨테이너
    구간합
    누적합
    docker
    점 업데이트
    imos법
    PrefixSum
    세그먼트 트리
    CORS
    오프라인 쿼리
    python
    interface
    docker image
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kimdozzi
[boj] 1655번: 가운데를 말해요
상단으로

티스토리툴바