Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags more
Archives
Today
Total
관리 메뉴

공부블로그

[프로그래머스] 모의고사 본문

IT/알고리즘

[프로그래머스] 모의고사

So1_b 2022. 6. 11. 16:11

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이 나왔다.

'IT > 알고리즘' 카테고리의 다른 글

[프로그래머스] 크레인 인형뽑기  (0) 2022.06.15
[프로그래머스] 3진법 뒤집기  (0) 2022.06.11
[프로그래머스] 실패율  (0) 2022.06.02
1일 1코딩 [프로그래머스]  (0) 2022.05.24
1일 1코딩 [프로그래머스]  (0) 2022.05.20
Comments