ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 2456번] 나는 학급회장이다
    Algorithm/기타 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

     

    'Algorithm > 기타' 카테고리의 다른 글

    [백준 2798번] 블랙잭  (0) 2019.11.28
    [백준 1002번] 터렛  (0) 2019.11.27
    [백준 13458번] 시험 감독  (0) 2019.11.26
    [백준 2562번] 최댓값  (0) 2019.11.20
    [백준 10172번] 개  (0) 2019.11.19

    댓글

Designed by Tistory.