Algorithm/기타

[백준 2456번] 나는 학급회장이다

agility 2019. 11. 23. 17:45

백준알고리즘 2456번 : 나는 학급회장이다

 

 생각보다 어려웠다. 고민해야하는게 너무 많았다고나 할까.

정렬을 한 다음에 최댓값을 구하고, 비교하고, 뭐 그래야하는지.

그러나 사실 열의 갯수가 가변적이지 않기 때문에 비교하는 범위는 한정적이다.

조건문을 몇 개 달아주면 해결할 수 있는 문제였는데,

 

조건식으로 이것들을 다 언제 커버해? 라는 생각이 들었지만,

default, 즉 if문을 안타고 내려오는 조건들을 잘 생각해서

조건문을 짜주니 생각보다는 로직이 복잡하지 않았던 것 같다.

다만 로직을 이해하기 어려웠을 뿐

 

 

다양한 조건을 고민해봐야한다.

 

1. 가장 큰 점수를 획득한 후보가 유일한 경우

2. 가장 큰 sum값이 2개이상인 경우

(3명에 모두 같은 값이면 어쩌지? 생각하면 골치아파진다.. 그런 고민을 없앨 수 있는 로직을 짜는게 중요한 것 같다.)

2-1. 동시에 3점의 갯수가 다른 경우

2-2. 동시에 3점의 갯수가 같은 경우

2-2-1. 동시에 2점의 갯수가 다른 경우

2-2-1. 동시에 2점의 갯수가 같은 경우

 

 

소스 ▽

더보기

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in);
		
		int [][] arr = new int [4][4];//열은 각후보들의 1점, 2점, 3점짜리 점수들
									//행은 1번, 2번, 3번후보를 명칭
		int count = sc.nextInt();
		for (int i = 0; i < count; i++) {
			arr[1][sc.nextInt()]++;
			arr[2][sc.nextInt()]++;
			arr[3][sc.nextInt()]++;
			
		}
		
		int tempMax = -1;
		int maxCount = 0; //가장 최댓값인 것의 갯수
		int chk = 0;// 완전한 동점자가 있는지 check
		int numb = -1;//최댓값을 가진 후보의 번호
		//1. 가장 큰 sum값이 유일한 경우...
		//2. 가장 큰 sum값이 2개이상인 경우
		
		for (int i = 1; i <= 3; i++) {
			int sum = arr[i][1]+2*arr[i][2]+3*arr[i][3];
			if (sum>tempMax) {//가장 클경우.
				tempMax = sum;
				maxCount++;//최댓값의 갯수는 현재 한개
				numb = i;//i번후보가 최댓값을 가짐
			}else if (sum==tempMax) {//2번 situation
				
				//기존 최댓값 후보의 3점 갯수가 새로 등장한 후보의 3점 갯수보다 큰경우는 default로 치고,
				
				if (arr[numb][3]<arr[i][3]) {////새로운 최댓값 후보의 3점 갯수가 기존 등장한 후보의 3점 갯수보다 크다면,
					numb = i;//당선 후보의 변경
					//마찬가지로, 기존 최댓값 후보의 2점 갯수가 새로 등장한 후보의 2점 갯수보다 큰 경우는 default로 치고
					chk = 0;
				}else if (arr[numb][3]==arr[i][3] && arr[numb][2]<arr[i][2]) {//3점 갯수가 동점이면서 새로 등장한 후보의 2점 갯수가 더 큰경우
					numb = i;//당선 후보의 변경
					chk = 0;
				}else if (arr[numb][3]==arr[i][3] && arr[numb][2]==arr[i][2]) {//3점, 2점 갯수 모두 동점이라면,
					chk = 1;//완전 동점자 발생
				}
			}
			
			
		}
		if (chk ==0) {
			System.out.println(numb+" "+tempMax);
		}else {
			numb=0;
			System.out.println(numb+" "+tempMax);
		}
	}
}

 

처음에는 소스에서 chk = 0 이라는 조건을 각 else if문 마다 삽입을 안했는데, 그렇게되면 오답이다.

1번, 2번후보가 3점, 2점의 갯수가 같고,

3번후보의 3점 횟수가 가장 클때 문제가 발생한다.

 

<<text case>>

6
3 2 1
2 3 1
1 2 3
2 1 3
1 2 3
2 1 3