🌞Algorithm/🔥Baekjoon

[Baekjoon] 5766_할아버지는 유명해!

뿌야._. 2024. 7. 3. 14:51
문제(출처: 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