문제(출처: https://www.acmicpc.net/problem/5766)
< 할아버지는 유명해! >
문제 풀이
HashMap을 사용하여 선수마다 얻은 포인트를 저장한다. HashMap 값을 ArrayList에 저장한 후 포인트를 기준으로 내림차순, 포인트가 같다면 선수 번호를 기준으로 오름차순 정렬 후 2등 선수의 번호를 출력한다.
my solution (Java)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.StringTokenizer;
public class _5766_ { // 할아버지는 유명해!
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int n, m;
st = new StringTokenizer(bf.readLine());
HashMap<Integer, Integer> map = new HashMap<>();
while ((n = Integer.parseInt(st.nextToken())) != 0 && (m = Integer.parseInt(st.nextToken())) != 0) {
for (int i = 0; i < n; i++) {
st = new StringTokenizer(bf.readLine());
for (int j = 0; j < m; j++) {
int num = Integer.parseInt(st.nextToken());
if (map.containsKey(num)) {
map.replace(num, map.get(num) + 1);
} else {
map.put(num, 1);
}
}
}
ArrayList<int[]> list = new ArrayList<>();
for (int key : map.keySet()) {
list.add(new int[] { key, map.get(key) });
}
Collections.sort(list, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o2[1] == o1[1]) {
return o1[0] - o2[0];
}
return o2[1] - o1[1];
}
});
int max = list.get(0)[1], cnt = 0;
for (int i = 0; i < list.size(); i++) {
if (list.get(i)[1] != max) {
if (cnt == 0)
cnt = list.get(i)[1];
if (cnt == list.get(i)[1])
bw.write(list.get(i)[0] + " ");
}
}
st = new StringTokenizer(bf.readLine());
map.clear();
bw.write("\n");
}
bw.flush();
}
}
변수)
n , m : 행, 열
map : HashMap <선수 번호, 포인트>
list : ArrayList <int [선수 번호, 포인트]>
max : 1등 포인트
cnt : 2등 포인트
행, 열이 0이 입력될 때까지 다음 과정을 반복한다.
1) 랭킹 정보를 입력받으며 HashMap에 랭킹에 이미 올랐던 선수면 value+1을, 랭킹에 없던 선수라면 (선수 번호, 1) 저장
2) HashMap의 key, value를 ArrayList에 저장
3) ArrayList를 포인트 기준 내림차순, 포인트가 같다면 선수 번호 기준 오름차순으로 정렬
4) 2등인 선수들의 번호 출력
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 4821_페이지 세기 (1) | 2024.07.05 |
---|---|
[Baekjoon] 1996_지뢰 찾기 (0) | 2024.07.04 |
[Baekjoon] 1913_달팽이 (0) | 2024.07.02 |
[Baekjoon] 1985_디지털 친구 (0) | 2024.07.01 |
[Baekjoon] 4396_지뢰 찾기 (0) | 2024.06.28 |