티스토리 뷰

www.acmicpc.net/problem/2456

 

2456번: 나는 학급회장이다

첫째 줄에는 반의 학생들의 수 N (3 ≤ N ≤ 1,000)이 주어진다. 다음 N개의 각 줄에는 각 학생이 제출한 회장후보 3명에 대한 선호 점수가 주어지는 데, 첫 번째 점수는 후보 1번에 대한 점수이고 두

www.acmicpc.net

 

풀이

 

1) Candidate 클래스를 정의한다. 멤버는 후보자 번호, 3점 개수, 2점 개수, 1점 개수, 총 점수 이다.

1-1) Candidate 클래스에 Comparable 인터페이스로 정렬 우선 순위를 정한다.  총점 > 3점 > 2점

2) 입력값을 리스트에 잘 저장한다.

3) Collections.sort 로 리스트를 정렬하여 가장 우선순위가 높은 후보의 번호와 최고 점수를 출력한다.

4) 만약 완전히 똑같은 최우선 후보가 2명이면 0과 최고 점수를 출력한다.

 

주의사항

 

1) x

 

package com.baekJoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class BJ_B1_2456_나는학급회장이다 {
	static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer tokens;
	static int N;
	static List<Candidate> list = new ArrayList<>();
	public static void main(String[] args) throws NumberFormatException, IOException {
		input = new BufferedReader(new StringReader(src));
		N = Integer.parseInt(input.readLine());
		list.add(new Candidate(1, 0, 0, 0, 0));
		list.add(new Candidate(2, 0, 0, 0, 0));
		list.add(new Candidate(3, 0, 0, 0, 0));
		
		for(int n=0; n<N; n++) {
			tokens = new StringTokenizer(input.readLine());
			int first = Integer.parseInt(tokens.nextToken());
			int second = Integer.parseInt(tokens.nextToken());
			int third = Integer.parseInt(tokens.nextToken());
			
			if(first == 1) {
				list.get(0).score1++;
			} else if(first == 2) {
				list.get(0).score2++;
			} else {
				list.get(0).score3++;
			}
			if(second == 1) {
				list.get(1).score1++;
			} else if(second == 2) {
				list.get(1).score2++;
			} else {
				list.get(1).score3++;
			}
			if(third == 1) {
				list.get(2).score1++;
			} else if(third == 2) {
				list.get(2).score2++;
			} else {
				list.get(2).score3++;
			}
			list.get(0).sum += first; 
			list.get(1).sum += second; 
			list.get(2).sum += third;
		}
		Collections.sort(list);
//		System.out.println(list);
		boolean flag = false;
		if(list.get(0).sum == list.get(1).sum) {
			if(list.get(0).score3 == list.get(1).score3) {
				if(list.get(0).score2 == list.get(1).score2) {
					flag = true;
				}
			}
		}
		
		if(flag) {
			System.out.println(0 + " " + list.get(0).sum);
		}else {
			System.out.println(list.get(0).num + " " + list.get(0).sum);
		}
	}
	
	static class Candidate implements Comparable<Candidate>{
		int num;
		int score3;
		int score2;
		int score1;
		int sum;
		
		public Candidate(int num, int score3, int score2, int score1, int sum) {
			super();
			this.num = num;
			this.score3 = score3;
			this.score2 = score2;
			this.score1 = score1;
			this.sum = sum;
		}

		@Override
		public int compareTo(Candidate o) {
			if(this.sum == o.sum) {
				if(this.score3 == o.score3) {
					return Integer.compare(o.score2, this.score2);
				}
				return Integer.compare(o.score3, this.score3);
			}
			return Integer.compare(o.sum, this.sum);
		}
	}
	static String src =
			"6\r\n" + 
			"3 1 2\r\n" + 
			"2 3 1\r\n" + 
			"3 1 2\r\n" + 
			"1 2 3\r\n" + 
			"3 1 2\r\n" + 
			"1 2 3";
}

 

 

후기

 

 브론즈 치고는 생각보다 코드가 길어진 문제이다. 그다지 어렵지는 않았지만 뭔가 더 좋은 방법이 있을것 같다.

하지만 시간이 워낙 빠르게 잘 나와서 그냥 두었다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함