🌞Algorithm/🔥Baekjoon

[Baekjoon] 5104_NoMoPhobia

뿌야._. 2025. 1. 6. 17:33
문제(출처: https://www.acmicpc.net/problem/5104)

< NoMoPhobia >

 

문제 풀이 

 

HashMap을 사용하여 각 학생별 점수를 계산한다.

 

 

 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.HashMap;
import java.util.StringTokenizer;

public class _5104_ { // NoMoPhobia

	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 = new StringTokenizer(bf.readLine());
        
		HashMap<String, Integer> table = new HashMap<>();
		table.put("TT", 75);
		table.put("TX", 50);
		table.put("PR", 80);
		table.put("RT", 30);
		table.put("AP", 25);
		table.put("PX", 60);
        
		HashMap<String, Integer> map = new HashMap<>();
        
		int w, n;
		while ((w = Integer.parseInt(st.nextToken())) != 0 && (n = Integer.parseInt(st.nextToken())) != 0) {
			ArrayList<String> names = new ArrayList<>();
			for (int i = 0; i < n; i++) {
				st = new StringTokenizer(bf.readLine());
				String name = st.nextToken();
				String code = st.nextToken();
                
				if (map.containsKey(name)) {
					map.replace(name, map.get(name) + table.get(code));
				} else {
					names.add(name);
					map.put(name, table.get(code));
				}
			}
            
			bw.write("Week " + w + " ");
			boolean flag = false;
			for (int i = 0; i < names.size(); i++) {
				if (map.get(names.get(i)) >= 100) {
					if (flag) {
						bw.write(",");
					}
					bw.write(names.get(i));
					flag = true;
				}
			}
            
			if (!flag) {
				bw.write("No phones confiscated");
			}
			bw.write("\n");
			st = new StringTokenizer(bf.readLine());
			map.clear();
		}
		bw.flush();
	}
}
변수)
table : 코드 별 점수
map : 학생 별 벌점
w, n : w주차, 벌점 개수
names : 입력된 순서
name, code : 학생별 벌점 코드
flag : 벌점 100 넘은 학생 존재 여부

 

table HashMap에 코드와 점수를 저장한다. w와 n이 0이 아닐 때까지 다음 과정을 반복한다.

1) n만큼 name과 code를 입력받는다.

2) map에 name을 key값으로 가지고 code에 해당하는 점수를 value에 더한다. 입력순으로 출력하기 위해 ArrayList에 name을 저장한다.

3) ArrayList에 저장한 이름순으로 map을 탐색하며 value가 100 이상이라면 이름을 출력한다.

4) 아무도 100 이상인 사람이 없다면 "No phones confiscated"를 출력한다.