🌞Algorithm/🔥Baekjoon

[Baekjoon] 29882_Ranking

뿌야._. 2025. 11. 4. 11:25
문제(출처: https://www.acmicpc.net/problem/29882)

< Ranking >

 

문제 풀이 

 

HashMap 2개를 사용하여 문제를 해결한다.

1) 각 참가자별 문제의 최대 점수를 저장

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 _29882_ { // Ranking
	static class Solution {
		private String task;
		private int point;

		public Solution(String task, int point) {
			this.task = task;
			this.point = point;
		}
	}

	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 = Integer.parseInt(bf.readLine());

		HashMap<String, ArrayList<Solution>> map = new HashMap<>();
		HashMap<String, Integer> result = new HashMap<>();

		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(bf.readLine());

			String name = st.nextToken();
			String task = st.nextToken();
			int point = Integer.parseInt(st.nextToken());

			if (map.containsKey(name)) {
				ArrayList<Solution> list = map.get(name);
				boolean flag = false;

				for (int j = 0; j < list.size(); j++) {
					if (list.get(j).task.equals(task)) {
						flag = true;
						if (list.get(j).point < point) {
							result.put(name, result.get(name) - list.get(j).point + point);
							list.get(j).point = point;
						}
					}
				}
				if (!flag) {
					result.put(name, result.get(name) + point);
					map.get(name).add(new Solution(task, point));
				}

			} else {
				ArrayList<Solution> list = new ArrayList<>();
				list.add(new Solution(task, point));

				map.put(name, list);
				result.put(name, point);
			}
		}
		ArrayList<String> answer = new ArrayList<>(result.keySet());
		Collections.sort(answer, new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return result.get(o2) - result.get(o1);
			}
		});

		for (String name : answer) {
			bw.write(name + " " + result.get(name) + "\n");
		}
		bw.flush();
	}
}
변수)
n : 제출된 풀이의 개수
map : HashMap <참가자 이름, ArrayList <문제 이름과 점수를 가지는 객체>> 
result : HashMap <참가자 이름, 총점>
name, task, point : 참가자 이름, 문제 이름, 점수
answer : HashMap result의 key 값 -> ArrayList

 

제출된 풀이의 개수를 입력받아 그 개수만큼 다음 과정을 반복한다.

 

1) 참가자 이름, 문제 이름, 점수를 입력받는다.

2) map에 key 값으로 참가자 이름이 있다면 value를 탐색한다. 문제 이름이 있다면 점수를 비교하여 최댓값으로 업데이트하고 result의 총점도 업데이트한다. 문제 이름이 없다면 map에 문제와 점수를 저장하고 총점도 업데이트한다.

3) map에 key 값으로 참가자 이름이 없다면 result와 map에 저장한다.

 

result의 key 값을 ArrayList로 변환하여 총점 기준 내림차순으로 정렬한다. 최종 ArrayList와 총점을 함께 출력한다.

 



 

'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글

[Baekjoon] 6379_Scramble Sort  (0) 2025.11.05
[Baekjoon] 21149_Unread Messages  (0) 2025.11.03
[Baekjoon] 5741_Soccer League  (0) 2025.10.31
[Baekjoon] 9794_Another Word Sorting  (0) 2025.10.30
[Baekjoon] 4676_Haiku Review  (0) 2025.10.29