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);
}
}
'알고리즘 공부 > 백준' 카테고리의 다른 글
[JAVA 46일차 / 하루 3문제] 15651번, 15652번, 9663번 (0) | 2025.04.08 |
---|---|
[JAVA 45일차 / 하루 3문제] 10870번, 25501번, 24060번 (0) | 2025.04.04 |
[JAVA 43일차 / 하루 3문제] 1037번, 25192번, 26069번 (0) | 2025.04.02 |
[JAVA 42일차 / 하루 3문제] 28279번, 2346번, 24511번 (0) | 2025.03.28 |
[JAVA 41일차 / 하루 3문제] 18258번, 2164번, 11866번 (0) | 2025.03.27 |