🌞Algorithm/🔥Baekjoon

[Baekjoon] 7863_Very Simple Problem

뿌야._. 2025. 10. 1. 11:59
문제(출처: https://www.acmicpc.net/problem/7863)

< Very Simple Problem >

 

문제 풀이 

 

다음 조건을 만족하는 문제 번호를 찾는다.

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

public class _7863_ { // Very Simple Problem

	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());

		int n = Integer.parseInt(st.nextToken());
		int p = Integer.parseInt(st.nextToken());

		HashMap<Integer, Integer> simple = new HashMap<>();
		Set<Integer> hard = new HashSet<>();

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

			int arr[] = new int[p];
			int min = 10001, max = 0;
			for (int j = 0; j < p; j++) {
				arr[j] = Integer.parseInt(st.nextToken());
				min = Math.min(min, arr[j]);
				max = Math.max(max, arr[j]);
			}

			for (int j = 0; j < p; j++) {
				if (arr[j] == min) {
					if (simple.containsKey(j + 1)) {
						simple.replace(j + 1, simple.get(j + 1) + 1);
					} else {
						simple.put(j + 1, 1);
					}
				}
				if (arr[j] == max) {
					hard.add(j + 1);
				}
			}
		}

		ArrayList<Integer> list = new ArrayList<>(simple.keySet());
		Collections.sort(list, new Comparator<Integer>() {
			@Override
			public int compare(Integer o1, Integer o2) {
				return simple.get(o2) - simple.get(o1);
			}
		});

		boolean flag = false;
		ArrayList<Integer> result= new ArrayList<>();
		for (int num : list) {
			if (simple.get(num) > n / 2 && !hard.contains(num)) {
				flag = true;
				result.add(num);
			}
		}
		
		if (!flag) {
			bw.write("0");
		}else {
			Collections.sort(result);
			for(int num : result) {
				bw.write(num+" ");
			}
		}
		bw.flush();
	}
}
변수)
n, p : 심사위원 수, 문제 수
simple : HashMap <가장 쉬운 문제 번호, 가장 쉬운 문제로 본 심사위원의 수>
hard : 가장 어려운 문제 번호
arr : 각 심사위원의 문제에 대한 점수
min, max : 각 심사위원의 점수 최솟값, 최댓값
list : simple key -> ArrayList
flag : 조건 만족 여부
result : 조건 만족하는 문제 번호

 

심사위원 수와 문제 수를 입력받는다. 심사위원 수만큼 다음 과정을 반복한다.

 

1) 각 문제에 해당하는 점수를 입력받으면서 심사위원의 점수 최솟값과 최댓값을 구한다.

2) 최솟값에 해당하는 문제 번호를 HashMap에 저장하고, 최댓값에 해당하는 문제 번호를 Set에 저장한다.

 

HashMap의 key값을 ArrayList로 변환 후 가장 쉬운 문제로 많이 본 문제 순으로 정렬한다. ArrayList를 탐색하면서 심사위원 과반수보다 많이 쉬운 문제로 지정되고 어려운 문제로 지정된 적 없는 문제 번호를 result ArrayList에 저장한다.

 

최종 ArrayList를 오름차순으로 정렬하여 출력한다. 이때, 조건에 맞는 문제가 없다면 "0"을 출력한다. 



 

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

[Baekjoon] 4962_Next Mayor  (0) 2025.10.02
[Baekjoon] 20680_Birds Rituals  (0) 2025.09.29
[Baekjoon] 18206_Soft Passwords  (0) 2025.09.26
[Baekjoon] 8978_VLAK  (0) 2025.09.25
[Baekjoon] 31023_Hit Song  (0) 2025.09.24