function solution(arr) {
var answer = [];
let p1 = [1,2,3,4,5];
let p2 = [2,1,2,3,2,4,2,5];
let p3 = [3,3,1,1,2,2,4,4,5,5]; //수포자 3명의 답 찍는 패턴.
let cnt1 = 0; //p1 몇개 맞췄는지 카운트.
let cnt2 = 0; //p2 몇개 맞췄는지 카운트.
let cnt3 = 0; //p3 몇개 맞췄는지 카운트.
let pIdx = 0; //수포자배열의 인덱스.
for(let i=0; i<arr.length; i++){ //p1
if(p1[pIdx] == arr[i]){
cnt1 += 1;
} //같으면 맞춘 갯수 ++
if(pIdx == p1.length-1){ //매개변수 배열이 p1,p2,p3 보다 길 수 있으므로 다시 순환하기 위해 pIdx를 초기화.
pIdx = -1;
}
pIdx++;
}
pIdx = 0;
for(let i=0; i<arr.length; i++){ //p2
if(p2[pIdx] == arr[i]){
cnt2 += 1;
} //같으면 맞춘 갯수 ++
if(pIdx == p2.length-1){
pIdx = -1;
}
pIdx++;
}
pIdx = 0;
for(let i=0; i<arr.length; i++){ //p3
if(p3[pIdx] == arr[i]){
cnt3 += 1;
} //같으면 맞춘 갯수 ++
if(pIdx == p3.length-1){
pIdx = -1;
}
pIdx++;
}
if(cnt1==cnt2 && cnt2==cnt3 && cnt1==cnt3){
if(cnt1==0 && cnt2==0 && cnt3==0){
return answer;
}
answer.push(1,2,3);
} else if(Math.max(cnt1, cnt2, cnt3) && cnt1 == cnt2){
answer.push(1,2);
} else if(Math.max(cnt1, cnt2, cnt3) == cnt2 && cnt3){
answer.push(2,3);
} else if(Math.max(cnt1, cnt2, cnt3) == cnt3 && cnt3 == cnt1){
answer.push(1,3);
} else {
if(Math.max(cnt1, cnt2, cnt3) == cnt1){
answer.push(1);
} else if(Math.max(cnt1, cnt2, cnt3)==cnt2){
answer.push(2);
} else if(Math.max(cnt1, cnt2, cnt3) == cnt3){
answer.push(3);
}
}
return answer.sort((a,b) => a-b);
}
왜 안될까 계속 코드를 살펴보고 고민하고 반례를 찾다가 문제점을 하나 발견했다.
바로 두번째 else if 문의 조건이다!
else if(Math.max(cnt1, cnt2, cnt3) == cnt2 && cnt3){
answer.push(2,3);
}
세 수 중에 가장 큰 값이 cnt2 이고 이 값이 cnt3 과 같을 때에 조건문이 실행되게 해야 했었는데 조건을 그냥 && cnt3 이라고만 적어서 테스트케이스 5, 7번이 통과가 안되었다.
else if(Math.max(cnt1, cnt2, cnt3) == cnt2 && cnt2== cnt3){
answer.push(2,3);
}
위와 같이 수정하여 해결했다!