본문 바로가기
알고리즘 공부/백준

[JAVA 32일차 / 하루 3문제] 25305번, 2751번, 10989번

by maverick11471 2025. 3. 11.

1. 25305번 커트라인

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken()); // 학생 수
        int K = Integer.parseInt(st.nextToken()); // 상을 받는 학생 수

        st = new StringTokenizer(br.readLine());
        Integer[] scores = new Integer[N];

        for (int i = 0; i < N; i++) {
            scores[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(scores, Collections.reverseOrder()); // 내림차순 정렬

        System.out.println(scores[K - 1]); // K번째 학생 점수 출력 (커트라인)
    }
}

2. 2751번 수 정렬하기2

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());
        Set<Integer> set = new TreeSet<>(); // 자동 정렬 + 중복 제거

        for (int i = 0; i < N; i++) {
            set.add(Integer.parseInt(br.readLine())); // 중복이 자동 제거됨
        }

        for (int num : set) {
            bw.write(num + "\n");
        }

        br.close();
        bw.flush();
        bw.close();
    }
}
  • TreeSet을 이용해 중복된 수를 제거한다.

3. 10989번 수 정렬하기3

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int N = Integer.parseInt(br.readLine());
        int[] count = new int[10001]; // 숫자 범위: 1 ~ 10,000

        // 입력된 숫자 카운트 증가
        for (int i = 0; i < N; i++) {
            count[Integer.parseInt(br.readLine())]++;
        }

        // 카운트 배열을 순회하면서 숫자 출력
        for (int i = 1; i <= 10000; i++) {
            while (count[i] > 0) { // 해당 숫자가 존재하면 출력
                bw.write(i + "\n");
                count[i]--; // 한 번 출력할 때마다 감소
            }
        }

        br.close();
        bw.flush();
        bw.close();
    }
}
  • 메모리가 8MB라는 점을 주의해야 한다. 일반적인 정렬 방식(퀵 정렬, 머지 정렬, Collections.sort 등)을 사용하면 메모리 초과가 발생할 가능성이 높다.
  • 해당 숫자의 인덱스의 카운트 숫자를 늘리면서 해당 숫자가 몇 번 나왔는지를 체크할 수 있다.