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