https://www.acmicpc.net/problem/2910
문제
- 첫째 줄에 메시지의 길이 N과 C ( 1 <= N <= 1000, 1 <= N <= 1000000000 ) 가 입력된다.
- 둘째 줄에 길이가 N인 수열이 주어진다.
- 둘째 줄에 적힌 수열에서 등장하는 횟수를 내림차순으로 정렬하여 해당 수를 등장 횟수만큼 출력한다. 이 때 등장하는 횟수가 같다면 수열에서의 위치를 기준으로 먼저 나온 것을 앞에 넣어 출력한다.
정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 C = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
Map<Integer, Integer> numbers = new HashMap<>();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(st.nextToken());
numbers.put(num, numbers.getOrDefault(num, 0) + 1);
if (!list.contains(num)) {
list.add(num);
}
}
Integer[] temp = numbers.values().toArray(new Integer[0]);
Arrays.sort(temp, Collections.reverseOrder());
StringBuilder sb = new StringBuilder();
int index = 0;
for (int i = 0; i < temp.length; i++) {
while (true) {
if (Objects.equals(numbers.get(list.get(index)), temp[i])) {
for (int k = 0; k < temp[i]; k++) {
sb.append(list.get(index)).append(" ");
}
list.remove(index);
index = 0;
break;
} else {
index++;
}
}
}
System.out.println(sb);
}
}
해당 수를 얻기 위한 조건만 잘 맞추면 된다.
총 두 개의 배열과 한 개의 HashMap을 사용했다.
하나의 배열에는 수열에서의 해당 수를 가장 먼저 등장한 수를 기준으로 배열에 삽입했다.
HashMap에는 수열에 등장한 수와 해당 수의 등장 횟수를 쌍으로 하여 HashMap에 삽입하도록 한다.
등장 횟수 Value를 배열에 모두 저장하여 등장 횟수를 내림차순으로 정렬.
등장 횟수 배열과 HashMap을 비교하여 처음에 만든 등장 순서 배열과 비교하여 출력할 수 있도록 한다.
'백준 문제 풀이 > 백준 (JAVA)' 카테고리의 다른 글
JAVA 백준 1931 회의실 배정 (정렬) (0) | 2025.05.20 |
---|---|
JAVA 백준 16713 Generic Queries (누적합) (0) | 2025.05.18 |
JAVA 백준 1302 베스트셀러 (정렬) (1) | 2025.05.17 |
JAVA 백준 2817 ALPS식 투표 (구현, 정렬) (1) | 2025.05.16 |
JAVA 백준 2840 행운의 바퀴 (구현) (0) | 2025.05.15 |