인프런 커뮤니티 질문&답변

현이님의 프로필 이미지
현이

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

11. 임시반장정하기

11. 임시반장 정하기 질문

작성

·

292

·

수정됨

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 인턴입니다.

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

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

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

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

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

현이님의 프로필 이미지
현이

작성한 질문수

질문하기