작성
·
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]){
에서는 i
와 j
가 같은 경우 즉, 자기 자신과의 비교도 포함되어 있었습니다. 이는 학생 i
를 기준으로 자신이 포함된 반이 몇 번인지 카운팅 할 때 자신을 한 번은 카운트하기 때문에 누락되지 않습니다.
그런데 문제의 목적이 각 학년마다 자신과 같은 반이었던 횟수가 가장 많은 학생을 찾는 것이기 때문에, i
와 j
가 같을 때도 카운팅을 해야 합니다. 같은 학생(i == j
)인 경우에는 항상 같은 반이므로 이 경우를 카운트에서 제외하면, 자기 자신이 포함된 반이 몇 번인지 정확하게 카운트할 수 없게 됩니다.
따라서 수정한 조건문에서 i != j
를 추가함으로써, 모든 학생에 대하여 자기 자신과 같은 반이었던 횟수를 1회 빼고 카운트하게 되므로 최대값을 찾는 로직에서 오류가 발생할 수 있습니다. 자기자신과의 비교가 제외되면 최대 같은 반 횟수를 가진 학생을 찾을 수 없기 때문에 오답 처리가 됩니다.
해당 강의의 커뮤니티 질문&답변 게시판에 질문해주시면, 강사님께서 더 상세하게 설명해 주실 수 있으실 겁니다.