인프런의 자바(Java)알고리즘 문제풀이 입문:코딩테스트 대비 강좌의 문제를 풀고 문제 해설을 작성해보았습니다.
섹션2. Array(1,2차원 배열)의 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 이하의 정수이다.
출력
첫 줄에 임시 반장으로 정해진 학생의 번호를 출력한다.
단, 임시 반장이 될 수 있는 학생이 여러 명인 경우에는 그 중 가장 작은 번호만 출력한다.
import java.util.Scanner;
public class 임시반장_정하기 {
public static void main(String[] args) {
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.println(solution(n,arr));
}
public static 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;
}
}
>> 해설
격자판이 1,1 위치부터 시작해야 하므로 2차원 배열 크기를 [n+1] (학생번호) [6](학년) 크기로 지정한다.
행의 위치(학생번호) 를 반복할 i는 1부터 n까지 반복하고,
열의 위치(학년) 를 반복할 j는 1부터 5까지 반복하면서 각 칸에 정수를 입력 받는다.
solution() 메서드를 호출하면서 인자를 전달하고 메서드를 실행한다.
학생 번호를 출력할 변수 answer을 0으로 초기화 하고, 다른 학생과 같은 반인 횟수를 저장할 max를 최소값으로 초기화 한다.
i를 1~n 까지 반복, j를 1~n까지 반복하는 데 이는 학생 번호의 역할을 할 것이다.
j 반복 전에 cnt값을 0으로 초기화 시켜서 i 1~n값마다 cnt값(동일한 반일 경우 누적되는 수)을 누적시킨다.
그리고 k를 1~5까지 반복하면서
[i][k], [j][k] 값을 비교한다.
둘의 값이 같으면 cnt를 증가시키고 해당 학생과의 비교는 1번만 하도록 하기 위해 break문으로 k - for문을 빠져나간다.
j - for문을 다 돌고 cnt 값과 max를 비교해서 cnt 가 크면 max에 cnt값을 넣고 answer에는 현재 i값을 넣는다.
'Computer Science > Algorithm' 카테고리의 다른 글
[Inflearn] 두 배열 합치기 (0) | 2023.02.07 |
---|---|
[Inflearn] 멘토링 (0) | 2023.02.04 |
[Inflearn] 봉우리 (0) | 2023.01.01 |
[Inflearn] 격자판 최대합 (0) | 2022.12.18 |
[Inflearn] 등수구하기 (0) | 2022.12.11 |