[프로그래머스] 모의고사
https://programmers.co.kr/learn/courses/30/lessons/42840
코딩테스트 연습 - 모의고사
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는
programmers.co.kr
22/6/10 ~ 22/06/12
1차 소스코드
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int start = 0; //answers의 인덱스
int idx = 0; //sd의 [][]인덱스, answer의 인덱스
int[][] sd = {
{1,2,3,4,5},
{2,1,2,3,2,4,2,5},
{3,3,1,1,2,2,4,4,5,5},
};
Integer[] correct = new Integer[sd.length];
Arrays.fill(correct,0);
for(int i=0; i<3; i++) {//sd의 []인덱스
do {
if(answers[start] == sd[i][idx]) {
correct[i]++;
}
start++; idx++;
if(start == answers.length) start = 0;
if(idx == sd[i].length) idx = 0;
}while(idx!=0 || start!=0); // 종료조건: idx==0 && start==0
}//for
System.out.println(Arrays.toString(correct));
int max=Collections.max(new ArrayList<Integer>(Arrays.asList(correct)));
ArrayList<Integer> list = new ArrayList<Integer>();
//max와 겹치는 값 확인
for(int i=0; i<correct.length; i++) {
if(max == correct[i]) {
list.add(i);
}
}
//오름차순 정렬
Collections.sort(list);
idx=0;
int[] answer=new int[list.size()];
for(int i: list) {
answer[idx++]=i;
}
return answer;
}
}

테스트1에서 수포자1,2,3의 값은 순서대로5,0,0으로 나와야하지만 위 코드는 5,8,1출력
맨 마지막 for문이 최댓값 max의 인덱스를 반환(1)하기 때문에 테스트1은 우연히 맞힌셈
문제 정답이 1,2,3,4,5일경우 이 패턴이 반복되고, 수포자 또한 패턴이 반복되어
예) 1 - > 1,2,3,4,5
2 -> 2,1,2,3,2,4,2,5
3 -> 3,3,1,1,2,2,4,4,5,5
채점한다고 생각했는데 지문 자체를 잘못 이해
2차 소스코드
import java.util.*;
class Solution {
public int[] solution(int[] answers) {
int idx = 0; //answers, answer의 인덱스 변수
int[][] sd = { //수포자 정답지
{1,2,3,4,5}, //1번 수포자
{2,1,2,3,2,4,2,5}, //2번 수포자
{3,3,1,1,2,2,4,4,5,5}, //3번 수포자
};
Integer[] correct = new Integer[sd.length]; //정답 개수
Arrays.fill(correct,0);
for(int i=0; i<3; i++){
idx=0;
while(idx < answers.length){
if(answers[idx] == sd[i][idx++%sd[i].length]){
correct[i]++;
}
}
}
int max=Collections.max(new ArrayList<Integer>(Arrays.asList(correct)));
ArrayList<Integer> list = new ArrayList<Integer>();
//max와 겹치는 값 확인
for(int i=0; i<correct.length; i++) {
if(max == correct[i]) {
list.add(i+1);
}
}
//오름차순 정렬
Collections.sort(list);
idx=0;
int[] answer=new int[list.size()];
for(int i: list) {
answer[idx++]=i;
}
return answer;
}
}
간과한 점
수포자의 답안지의 패턴 전체가 반복되는게 아니라 answers의 길이만큼만 답안지가 반복되는 것.
예)
수포자1: 1,2,3,4,5
수포자2: 2,1,2,3,2,4,2,5
수포자3: 3,3,1,1,2,2,4,4,5,5
answer 1,2,3,4,5,1,2일경우
수포자1: 1,2,3,4,5,1,2 가 반복
수포자2: 2,1,2,3,2,4,2 만 반복
수포자3: 3,3,1,1,2,2,4 만 반복
따라서 순서대로 정답횟수는 [7,1,0]
테스트 케이스 Parameters: [1,2,3,4,5,1,2] return: [1]을 추가로 넣어 실행성공하니
정확성 100이 나왔다.