개발하는지호

[배열] 11. 임시반장 정하기

by 개발하는지호
11. 임시반장 정하기
 

설명

김갑동 선생님은 올해 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;
class Main {
public int solution(int n, int[][] arr) {
int index = 0;
int count = 0;
int[] answer = new int[n];
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (arr[index][i] == arr[j][i]) count++;
}
}
answer[index++] = count;
count = 0;
}
int max = Integer.MIN_VALUE;
for(int x : answer) {
if (x > max) max = x;
}
int person = 0;
for (int i = 0; i < n; i++) {
if (max == answer[i]) {
person = i;
break;
}
}
return person + 1;
}
public static void main(String[] args) {
Main T = new Main();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = in.nextInt();
}
}
System.out.println(T.solution(n, arr));
}
}

 

 

-강사님 풀이-

 

강사님 풀이는 매우 성공적이다. ㅋㅋ 내가 신경을 못썼던 중복되는 학생의 수를 break로 방지한다.

이 조건만 조심하면 푸는데 어려움이 없는 문제이다.

 

그리고 강사님은 학생 번호와 맞추기 위해 n=1부터 시작하고 범위도 바꿨는데, 그래도 상관이 없는 상황이라면 나도 이런 식으로 사용하는 유연한 사고가 필요한 것 같다. (물론 내 방식대로 마지막에 + 1을 해줘도 되지만 가독성 측면에서 보았을 때는 강사님 방식이 더 좋다.)

import java.util.Scanner;
class Main {
public int solution(int n, int[][] arr) {
int answer = 0, 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 in = new Scanner(System.in);
int n = in.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] = in.nextInt();
}
}
System.out.println(T.solution(n, arr));
}
}

 

 

블로그의 프로필 사진

블로그의 정보

DevSecOps

개발하는지호

활동하기