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

[JAVA 44일차 / 하루 3문제] 2108번, 20920번, 27433번

by maverick11471 2025. 4. 3.

1. 2108번 통계학

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));
        int N = Integer.parseInt(br.readLine());
        int[] numbers = new int[N];
        int[] freq = new int[8001]; // -4000 ~ 4000을 저장하기 위한 배열
        int sum = 0, maxFreq = 0, min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;

        for (int i = 0; i < N; i++) {
            numbers[i] = Integer.parseInt(br.readLine());
            sum += numbers[i];
            freq[numbers[i] + 4000]++; // 음수를 포함한 빈도 카운트
            maxFreq = Math.max(maxFreq, freq[numbers[i] + 4000]);
            min = Math.min(min, numbers[i]);
            max = Math.max(max, numbers[i]);
        }

        Arrays.sort(numbers); // 중앙값을 구하기 위해 정렬

        // 최빈값 찾기
        List<Integer> modeList = new ArrayList<>();
        for (int i = 0; i < 8001; i++) {
            if (freq[i] == maxFreq) {
                modeList.add(i - 4000); // 원래 숫자로 변환
            }
        }
        Collections.sort(modeList); // 여러 개일 경우 두 번째 작은 값 찾기
        int mode = (modeList.size() > 1) ? modeList.get(1) : modeList.get(0);

        // 결과 출력
        System.out.println(Math.round((double) sum / N)); // 산술평균
        System.out.println(numbers[N / 2]); // 중앙값
        System.out.println(mode); // 최빈값
        System.out.println(max - min); // 범위
    }
}

2. 20920번 영단어 암기는 괴로워

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));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken()); // 단어 개수
        int M = Integer.parseInt(st.nextToken()); // 최소 길이 조건

        Map<String, Integer> wordCount = new HashMap<>(); // 단어 빈도 저장

        for (int i = 0; i < N; i++) {
            String word = br.readLine();
            if (word.length() >= M) { // M 미만 단어는 무시
                wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
            }
        }

        // 정렬을 위해 리스트로 변환
        List<String> words = new ArrayList<>(wordCount.keySet());

        // 정렬 기준 적용
        words.sort((a, b) -> {
            if (!wordCount.get(a).equals(wordCount.get(b))) {
                return wordCount.get(b) - wordCount.get(a); // 1. 빈도 내림차순
            }
            if (a.length() != b.length()) {
                return b.length() - a.length(); // 2. 길이 내림차순
            }
            return a.compareTo(b); // 3. 사전순 오름차순
        });

        // 출력
        for (String word : words) {
            sb.append(word).append("\n");
        }
        System.out.print(sb);
    }
}
  • wordCount.getOrDefault(word, 0) + 1 를 사용하여 기존 값이 있으면 +1 증가 : 중복 된 수를 구해야 할 때 이 메서드를 사용하면 된다.
  • Collections.sort(list, (a, b) -> 비교값);
    • 비교값 -1 : a가 b보다 앞으로 온다 (오름차순)
    • 비교값 0 : 위치 변경 없음
    • 비교값 1 : a가 b보다 뒤로 간다 (내림차순)

3. 27433번 팩토리얼 2

import java.io.*;

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

        int N = Integer.parseInt(br.readLine()); // 입력값 읽기
        System.out.println(factorial(N)); // 팩토리얼 계산 및 출력
    }

    // 재귀 함수로 팩토리얼 구현
    public static long factorial(int n) {
        if (n == 0) return 1; // 0! = 1
        return n * factorial(n - 1);
    }
}