inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

11. 임시반장정하기

11. 임시반장 정하기 질문

384

현이

작성한 질문수 15

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));

    }
}

 

java 코딩-테스트

답변 1

0

인프런 AI 인턴

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

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

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

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

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

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

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

27

1

갑자기 채점 사이트가 바뀌었어요

0

32

1

문제 리스트 페이지

0

27

1

채점 사이트 관련 질문드립니다

0

23

1

봉우리 문제 질문입니다

0

81

2

씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?

0

64

0

이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?

0

72

0

가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법

0

67

1

좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ

0

85

2

6-7 강의에서

0

48

1

6-6. 장난꾸러기 질문 있습니다.

0

45

1

강의 수강후 코딩테스트

0

109

1

answer 변수 사용 여부

0

44

1

2중 for문

1

85

2

2-11. 임시반장정하기 (Runtime Error)

0

63

1

혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?

0

70

1

이런 풀이는 어떨까요

0

43

1

자바 스트림 방식의 효율성 질문 드립니다.

0

57

1

알고리즘 자료 구조들..

0

62

1

StringBuilder vs BufferdWriter

0

47

1

원더랜드(프림)

0

50

1

이런 코드는 어떤가요?

0

61

1

bfs 풀이

0

57

1

병합정렬

0

56

1