728x90
    
    
  https://www.acmicpc.net/problem/1268

- 예제 입력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
- 문제 접근
- 입력
- 학생의 수 N
 - N개의 줄만큼 1 ~ 5학년의 반이 공백으로 입력
 
 - 출력
- 같은 반이 가장 많았던 학생이 임시 반장 → 수가 같으면 가장 작은 번호
 
 
 - 입력
 - 문제 해결
- 총 N번의 반복문으로 검증
 - 같은 번호의 학생이 중복 카운팅 되지 않도록 boolean 배열 사용
 - i번 학생의 같은 반이였던 학생들의 숫자를 저장하기 위한 배열 사용
 - 같은 반 친구가 가장 많았던 학생을 1번 학생부터 확인하여 출력 후 종료
 
 
- 기존 풀이 [메모리 : 21116 KB / 시간 : 220 ms]
 
static int student;
static int[] friendCount;
static int[][] map;
public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    student = Integer.parseInt(br.readLine());
    // 1~5학년 반을 저장할 배열
    map = new int[student+1][student+1];
    for(int i = 1; i <= student; i++){
        int[] input = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        // input의 0번인덱스부터 5개를 -> map[i]번의 1번인덱스부터 5개까지 복사 (?)
        System.arraycopy(input, 0, map[i], 1, 5);
    }
    // 같은 학년이였던 친구를 체크할 배열
    friendCount = new int[student+1];
    setFriendCount();
    // 같은 학년이였던 친구가 가장 높은 숫자 추출
    int maxFriend = Arrays.stream(friendCount).max().getAsInt();
    // 가장 낮은 번호를 출력하면 되기 때문에 maxFriend와 일치하면 출력하고 종료
    for(int i = 1; i <= student; i++){
        if(maxFriend == friendCount[i]){
            System.out.println(i);
            break;
        }
    }
}
private static void setFriendCount(){
    // 학생 번호 1번부터 ~ N번까지 반복
    for(int studentNumber = 1; studentNumber <= student; studentNumber++){
        // 중복 체크하지 않도록 boolean 배열 생성
        boolean[] check = new boolean[student + 1];
        // 자기 자신을 체크하지 않도록 true로 변경
        check[studentNumber] = true;
        // 1학년부터 5학년까지 시작
        for(int grade = 1; grade <= 5; grade++){
            // N번 학생의 ?학년에 몇반이였는지 저장 
            int classNumber = map[studentNumber][grade];
            // 1번 학생부터 N번 학생까지 반복
            for(int friendNumber = 1; friendNumber <= student; friendNumber++){
                // 친구 번호가 나랑 같으면 무시
                if(friendNumber == studentNumber) continue;
                // 나의 A학년 반과 친구의 A학년 반이 같고 / 이미 체크된 친구가 아니라면 (처음 등장한 친구라면) 
                if(classNumber == map[friendNumber][grade] && !check[friendNumber]){
                    check[friendNumber] = true; // 체크 표시
                    friendCount[studentNumber]++; // 친구 + 1
                }
            }
        }
    }
}
728x90
    
    
  'Coding Test > Problem Number' 카테고리의 다른 글
| [Java] 가장 큰 증가하는 부분 수열 [11055번] (0) | 2024.08.02 | 
|---|---|
| [Java] 가장 긴 감소하는 부분 수열 [11722번] (0) | 2024.08.02 | 
| [Java] 통계학 [2108번] (0) | 2024.08.01 | 
| [Java] 스위치 켜고 끄기 [1244번] (0) | 2024.08.01 | 
| [Java] 30 [10610번] (0) | 2024.07.31 |