• 카테고리

    질문 & 답변
  • 세부 분야

    알고리즘 · 자료구조

  • 해결 여부

    미해결

11. 임시반장 정하기 질문

24.01.19 19:14 작성 24.01.19 19:15 수정 조회수 171

0

- 우선 채점사이트에서 정답처리 받은 코드이고요, 핵심부분입니다.

int  answer = 0, max=0 ;
int cnt=0;
for(int i=1; i<=n; i++){ // i학생이
    cnt=0;
    for(int j=1; j<=n; j++){ //j학생들을 탐색하면서
        for(int k=1; k<=5; k++){ //학년 돌면서 탐색
            if(arr[i][k] == arr[j][k]){
                cnt++;
                break; // 한번이라도 같은반인게 조건이기 때문에
            }
        }
        if(max < cnt){
            max = cnt;
            answer=i;
        }
    }
}

- 이 코드의 조건문 부분 코드

if(arr[i][k] == arr[j][k]){

이것을, 학생들을 탐색할때 자기자신을 탐색하지 않기 위해 아래와 같이 조건문을 바꾸었더니 오답처리 되었습니다. 오답처리 된 이유가 궁금합니다.

if(i != j && arr[i][k] == arr[j][k]){

 

 

*참고용 전체 코드

import java.util.*;
public class Main {
    public int solution(int n, int [][] arr){
        int  answer = 0, max=0 ;
        int cnt=0;
        for(int i=1; i<=n; i++){ // i학생이
            cnt=0;
            for(int j=1; j<=n; j++){ //j학생들을 탐색하면서
                for(int k=1; k<=5; k++){ //학년 돌면서 탐색
                    if( i != j && arr[i][k] == arr[j][k]){
                        cnt++;
                        break; // 한번이라도 같은반인게 조건이기 때문에
                    }
                }
                if(max < cnt){
                    max = cnt;
                    answer=i;
                }
            }
        }
        return answer;
    }

    public static void main(String[] args) {
        Main M = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.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] = kb.nextInt();
            }
        }
        System.out.print(M.solution(n,arr));

    }
}

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.01.21

안녕하세요, 인프런 AI 인턴입니다.

질문 주신 코드의 수정된 조건문에서, 자기 자신과의 비교를 제외한 결과 오답 처리가 되었다는 부분에 대해서 설명을 드리겠습니다.

기존 조건문인 if(arr[i][k] == arr[j][k]){ 에서는 ij가 같은 경우 즉, 자기 자신과의 비교도 포함되어 있었습니다. 이는 학생 i를 기준으로 자신이 포함된 반이 몇 번인지 카운팅 할 때 자신을 한 번은 카운트하기 때문에 누락되지 않습니다.

그런데 문제의 목적이 각 학년마다 자신과 같은 반이었던 횟수가 가장 많은 학생을 찾는 것이기 때문에, ij가 같을 때도 카운팅을 해야 합니다. 같은 학생(i == j)인 경우에는 항상 같은 반이므로 이 경우를 카운트에서 제외하면, 자기 자신이 포함된 반이 몇 번인지 정확하게 카운트할 수 없게 됩니다.

따라서 수정한 조건문에서 i != j를 추가함으로써, 모든 학생에 대하여 자기 자신과 같은 반이었던 횟수를 1회 빼고 카운트하게 되므로 최대값을 찾는 로직에서 오류가 발생할 수 있습니다. 자기자신과의 비교가 제외되면 최대 같은 반 횟수를 가진 학생을 찾을 수 없기 때문에 오답 처리가 됩니다.

해당 강의의 커뮤니티 질문&답변 게시판에 질문해주시면, 강사님께서 더 상세하게 설명해 주실 수 있으실 겁니다.