1. 문제 설명
- 설명
김갑동 선생님은 올해 6학년 1반 담임을 맡게 되었다.
김갑동 선생님은 우선 임시로 반장을 정하고 학생들이 서로 친숙해진 후에 정식으로 선거를 통해 반장을 선출하려고 한다.
그는 자기 반 학생 중에서 1학년부터 5학년까지 지내오면서 한 번이라도 같은 반이었던 사람이 가장 많은 학생을 임시 반장으로 정하려 한다.
그래서 김갑동 선생님은 각 학생들이 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 표를 만들었다.
예를 들어 학생 수가 5명일 때의 표를 살펴보자.
아래의 경우에 4번 학생을 보면 3번 학생과 2학년 때 같은 반이었고, 3번 학생 및 5번 학생과 3학년 때 같은 반이었으며,
2번 학생과는 4학년 때 같은 반이었음을 알 수 있다. 그러므로 이 학급에서 4번 학생과 한 번이라도
같은 반이었던 사람은 2번 학생, 3번 학생과 5번 학생으로 모두 3명이다.
이 예에서 4번 학생이 전체 학생 중에서 같은 반이었던 학생 수가 제일 많으므로 임시 반장이 된다.
각 학생들이 1학년부터 5학년까지 속했던 반이 주어질 때, 임시 반장을 정하는 프로그램을 작성하시오.
1학년 | 2학년 | 3학년 | 4학년 | 5학년 | |
1번 | 2 | 3 | 1 | 7 | 3 |
2번 | 4 | 1 | 9 | 6 | 8 |
3번 | 5 | 5 | 2 | 4 | 4 |
4번 | 6 | 5 | 2 | 6 | 7 |
5번 | 8 | 4 | 2 | 2 | 2 |
- 입력
첫째 줄에는 반의 학생 수를 나타내는 정수가 주어진다. 학생 수는 3 이상 1000 이하이다.
둘째 줄부터는 1번 학생부터 차례대로 각 줄마다 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 5개의 정수가 빈칸 하나를 사이에 두고 주어진다.
주어지는 정수는 모두 1 이상 9 이하의 정수이다. - 출력 : 첫 줄에 임시 반장으로 정해진 학생의 번호를 출력한다. 단, 임시 반장이 될 수 있는 학생이 여러 명인 경우에는 그중 가장 작은 번호만 출력한다.
- 출처 : 한국정보올림피아드
2. 문제 코드 및 풀이 설명
import java.util.Scanner;
public class ChoosePresident {
public static void main(String[] args) {
ChoosePresident T = new ChoosePresident();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int[][] arr = new int[n][5];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 5; j++) {
arr[i][j] = kb.nextInt();
}
}
System.out.println(T.solution(arr, n));
}
// 해결방법
// 각 학생 별로 반복문을 돌려서 같은 값을 비교
// 삼중 반복문을 사용하여 각 학생의 학년별, 학생별 중복 값 비교
public int solution(int[][] arr, int n) {
int answer = 0, max = 0;
for (int i = 0; i < n; i++) { // 각 학생별로 반복
int cnt = 0;
for (int j = 0; j < n; j++) { // 선택된 학생과 다른 학생을 비교 반복
for (int k = 0; k < 5; k++) { // 다른 학생과 학년별로 같은 경우가 있는지 확인
// 비교시에 같은 경우가 있다면 카운트 후 break
if (arr[i][k] == arr[j][k]){
cnt++;
break;
}
}
}
// 카운트했을때 더 클때만 바꾸어줌
// 더 클때만 바꾸기에 같을 경우 먼저 비교한 학생의 번호가 저장됨
if(cnt>max){
max = cnt;
answer = i + 1; // 0번부터 시작했으니 1 더해줌
}
}
return answer;
}
}
3. 출력 예시
입력
5
2 3 1 7 3
4 1 9 6 8
5 5 2 4 4
6 5 2 6 7
8 4 2 2 2
출력
4
위의 내용은 인프런에서 수강할 수 있는 김태원님의 자바 알고리즘 문제풀이 강의를 바탕으로 공부한 내용을 정리한 내용입니다!