문제
김갑동 선생님은 올해 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
풀이
그림처럼 삼중 for문으로 풀면되는 문제다.
이렇게 풀면 자기 자신도 카운트되지만 문제의 답은 몇번 학생인지 구하는 것이니까 상관없다.
같은 반인 학생을 카운트할 때 중복되면 안되므로 꼭 break해서 탈출해야 한다는 점을 주의!
코드
import java.util.Scanner;
public class Main {
static int[] dx = {-1, 0, 1, 0};
static int[] dy= {0, 1, 0, -1};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[][] student = new int[n+1][n+1];
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
student[i][j] = in.nextInt();
}
}
int max = Integer.MIN_VALUE;
int answer = 0;
for(int i=1; i<=n; i++) { //i번학생 순회
int cnt = 0;
for(int j=1; j<=n; j++) { //j번학생 순회
for(int k=1; k<=n; k++) { //학년 순회
if(student[i][k] == student[j][k]) {
cnt++;
break; //주의!!! 중복X
}
}
}
if(cnt > max) {
max = cnt;
answer = i;
}
}
System.out.print(answer);
}
}
'PS(Java) > 인프런 강의 문제' 카테고리의 다른 글
[PS] 인프런 강의 - Two Pointers, Sliding window, Math 1. 두 배열 합치기 (0) | 2022.10.21 |
---|---|
[PS] 인프런 강의 - Arrays 12. 멘토링 (0) | 2022.10.21 |
[PS] 인프런 강의 - Array 10. 봉우리 (0) | 2022.10.20 |
[PS] 인프런 강의 - Array 9. 격자판 최대합 (0) | 2022.10.18 |
[PS] 인프런 강의 - Array 8. 등수구하기 (0) | 2022.10.18 |