이 영역을 누르면 첫 페이지로 이동
Arc 블로그의 첫 페이지로 이동

Arc

페이지 맨 위로 올라가기

Arc

[Baekjoon] 1655: 가운데를 말해요

  • 2023.03.02 16:43
  • Algorithm/PS
글 작성자: SeoArc

문제

수가 순차적으로 주어지면 입력된 수 들 중에서 중간값을 계속 출력해나가는 문제이다 -> 짝수개 일 시 더 작은 값 출력

 

풀이

내 풀이

package baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Q1655 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        // 최대힙, 최소힙 하나씩 생성
        Queue<Integer> left = new PriorityQueue<>(Comparator.comparingInt(c -> -c));
        Queue<Integer> right = new PriorityQueue<>(Comparator.comparingInt(c -> c));

        int n = Integer.parseInt(br.readLine());

        // 최대힙에 초기값 삽입
        int one = Integer.parseInt(br.readLine());
        left.offer(one);
        sb.append(one).append("\n");

        for (int i = 1; i < n; i++) {
            int num = Integer.parseInt(br.readLine());

            int peek = left.peek();

            // 각 값을 초기값과 비교하여 크기에 따라 삽입
            if (num <= peek) {
                left.offer(num);
            } else {
                right.offer(num);
            }

            // 사이즈가 1개 이하 차이날 때 까지 조정
            while (left.size() - right.size() > 1) {
                right.offer(left.poll());
            }

            while (right.size() - left.size() > 0) {
                left.offer(right.poll());
            }

            sb.append(Math.min(left.peek(), right.peek())).append("\n");
        }

        System.out.print(sb);
    }
}

이 문제는 풀이가 오래 걸렸던 것 같다.

필기를 몇시간 하고나서야 중간값을 찾을 방법을 떠올렸다.

큐 2개를 사용하여 하나는 최대 힙, 하나는 최소 힙으로 만든 다음, 두 큐의 사이즈 차이가 최대 1이 될때까지 사이즈를 조정하여 값을 꺼내주는 것이다.

이렇게 하면 금방 풀이가 가능하다. 이 문제는 전에 한 번 풀어본 기억이 있음에도 오랜만에 푸니까 풀이를 떠올리는데 너무 오래걸렸다

 

회고

큐 말고도 이분 탐색으로도 풀이가 가능하다고 한다. 정해는 큐이겠지만, 한 번 이분탐색으로도 풀이해볼 필요가 있을 것 같다.

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

[Baekjoon] 7662: 이중 우선순위 큐  (0) 2023.03.08
[Baekjoon] 2533: 사회망 서비스(SNS)  (0) 2023.03.02
[Baekjoon] 2170: 선 긋기  (0) 2023.03.02
[Baekjoon] 9935: 문자열 폭발  (2) 2023.03.02
[Baekjoon] 16934: 게임 닉네임  (0) 2023.03.02

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Baekjoon] 7662: 이중 우선순위 큐

    [Baekjoon] 7662: 이중 우선순위 큐

    2023.03.08
  • [Baekjoon] 2533: 사회망 서비스(SNS)

    [Baekjoon] 2533: 사회망 서비스(SNS)

    2023.03.02
  • [Baekjoon] 2170: 선 긋기

    [Baekjoon] 2170: 선 긋기

    2023.03.02
  • [Baekjoon] 9935: 문자열 폭발

    [Baekjoon] 9935: 문자열 폭발

    2023.03.02
다른 글 더 둘러보기

정보

Arc 블로그의 첫 페이지로 이동

Arc

  • Arc의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록

카테고리

  • 분류 전체보기 (106)
    • Language (28)
      • C++ (0)
      • C# (0)
      • Java (28)
    • Algorithm (47)
      • Algorithm (15)
      • Data Structure (6)
      • PS (26)
    • Computer Science (22)
      • Design Pattern (1)
      • Network (14)
      • OS (7)
    • Game (0)
      • Unity (0)
    • Backend (3)
      • Spring (1)
      • JPA (2)
    • DB (0)
      • SQL (0)
    • DevOps (2)
      • AWS (0)
      • Docker (2)
      • Jenkins (0)
      • Nginx (0)
    • Software Engineering (4)
      • OOP (4)
    • AI (0)
      • Machine Learning (0)
    • Others (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • network
  • graph
  • 그래프
  • algorithm
  • 알고리즘
  • java
  • 자바
  • 네트워크

나의 외부 링크

정보

SeoArc의 Arc

Arc

SeoArc

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © SeoArc. Designed by Fraccino.

티스토리툴바