[배열] 임시반장 정하기 .java
설명
김갑동 선생님은 올해 6학년 1반 담임을 맡게 되었다.
김갑동 선생님은 우선 임시로 반장을 정하고 학생들이 서로 친숙해진 후에 정식으로 선거를 통해 반장을 선출하려고 한다.
그는 자기반 학생 중에서 1학년부터 5학년까지 지내오면서 한번이라도 같은 반이었던 사람이 가장 많은 학생을 임시 반장으로 정하려 한다.
그래서 김갑동 선생님은 각 학생들이 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 표를 만들었다.
예를 들어 학생 수가 5명일 때의 표를 살펴보자.
위 경우에 4번 학생을 보면 3번 학생과 2학년 때 같은 반이었고, 3번 학생 및 5번 학생과 3학년 때 같은 반이었으며,
2번 학생과는 4학년 때 같은 반이었음을 알 수 있다.
그러므로 이 학급에서 4번 학생과 한번이라도 같은 반이었던 사람은 2번 학생, 3번 학생과 5번 학생으로 모두 3명이다.
이 예에서 4번 학생이 전체 학생 중에서 같은 반이었던 학생 수가 제일 많으므로 임시 반장이 된다.
각 학생들이 1학년부터 5학년까지 속했던 반이 주어질 때, 임시 반장을 정하는 프로그램을 작성하시오.
입력
첫째 줄에는 반의 학생 수를 나타내는 정수가 주어진다. 학생 수는 3 이상 1000 이하이다.
둘째 줄부터는 1번 학생부터 차례대로 각 줄마다 1학년부터 5학년까지 몇 반에 속했었는지를 나타내는 5개의 정수가 빈칸 하나를 사이에 두고 주어진다.
주어지는 정수는 모두 1 이상 9 이하의 정수이다.
출력
첫 줄에 임시 반장으로 정해진 학생의 번호를 출력한다.
단, 임시 반장이 될 수 있는 학생이 여러 명인 경우에는 그 중 가장 작은 번호만 출력한다.
예시 입력 1
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
예시 출력 1
4
출처 : 한국정보올림피아드
내 풀이
- 첫 번째 -> 실패
문제 이해를 못해서 실패했다. 각 학년마다 같은 반인 학생 수를 세고 이 총합이 가장 높은 학생을 선출하였다
예제가 계속 실패가 뜨길래 문제를 처음부터 다시 읽고 나서야 알았다
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][5];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 5; j++) {
arr[i][j] = sc.nextInt();
}
}
int max = 0;
int ele = 0;
for(int i = 0; i < n; i++){
int meet = 0;
for(int j = 0; j < 5; j++){
int cnt = arr[i][j];
for(int k = 0; k < n; k++){
if(cnt == arr[k][j]) meet++;
}
}
if(meet > max) {
max = meet;
ele = i;
}
}
System.out.print(ele+1);
}
}
- 두번째 풀이 -> 성공
문제를 제대로 이해했으니 다시 풀었다
1. 한 학생이 n명의 학생을 한 번이라도 만났는지를 확인 -> i와 j는 학생으로 각각 n번만큼 반복
2. 그 안에서 1~5학년의 반을 비교 => 만난 적이 있다면 meet 변수 증가 -> 한 번이라도 만난 것을 확인하면 됨 -> break
3. 한 학생이 만난 학생 수를 다 얻었다면 max값과 비교하여 최댓값을 갱신
4. 마지막 정답에서 학생 번호는 0이 아닌 1부터 시작하기 때문에 더하기 1
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][5];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 5; j++) {
arr[i][j] = sc.nextInt();
}
}
int ele = 0;//임시반장이 될 학생 번호
int max = Integer.MIN_VALUE;//ele 학생이 만난 학생 수
for(int i = 0; i < n; i++){
int meet = 0;//초기화
for(int j = 0; j < n; j++){
for(int k = 0; k < 5; k++){//1학년부터 5학년까지
if(arr[i][k] == arr[j][k]){//만난적이 있으면
meet++;//만난 학생수 증가
break;//1번이라도 같은 반이었다면 카운트 -> 만났으니 break
}
}
}
if(meet > max) {//갱신
max = meet;
ele = i;
}
}
System.out.print(ele+1);//학생번호는 1부터 시작이기에 1 더하기
}
}
다른 풀이
학생 번호가 1부터 시작이기에 1~5 인덱스를 사용 -> n+1 크기
학년도 1부터 5학년이기 때문에 1~5 인덱스를 사용 -> 6
=> arr[n+1][6]의 크기
이 부분만 다르고 나의 풀이와 비슷하다
import java.util.Scanner;
public class Main {
public static int solution(int n, int[][] arr){
int answer = 0;
int max = Integer.MIN_VALUE;
for(int i = 1; i <= n; i++){
int cnt = 0;
for(int j = 1; j <= n; j++){
for(int k = 1; k <= 5; k++){
if(arr[i][k] == arr[j][k]){
cnt++;
break;
}
}
}
if(cnt > max){
max = cnt;
answer = i;
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n+1][6];
for(int i = 1; i < n; i++){
for(int j = 1; j <= 5; j++){
arr[i][j] = sc.nextInt();
}
}
System.out.print(T.solution(n, arr));
}
}
💡💡
특히 배열 문제에서 각 배열의 뜻이나 문제에서 원하는 값을 정확히 알아야 금방 풀 수 있다
문제에 모든 것이 나와있으니 제대로 이해한 뒤에 해보기!!!!!!
만약 계속 틀린다면 이해를 못한 것이기 때문에 문제로 돌아갈 것