본문 바로가기
Algorizym/Java

[Algorizym-Java] 모의고사 (Programmers coding test)

by Dev. Pluto 2021. 7. 1.
반응형

완전탐색(brute-force) 방법으로 접근한 문제입니다. 앞으로 개념적으로만 이해하였던 알고리즘 풀이방법 (DFS/BFS, 동적 프로그래밍,  Greedy 기법 등)을 공부하면서 구현해 나갈 것이지만 컴퓨터의 아주 빠른 처리속도를 이용한 모든 경우의 수를 세어보고 정답이 되는 부분만 골라내는 기법인 완전탐색을 사용하여 쉽고 간단하게 문제를 풀이할 수 있습니다

 

하지만 완전탐색의 모든 경우의 수를 계산하는 특성 상, 알고리즘의 구현 이전에 문제에서 제시한 시간복잡도 범주 이내에 들어오는 것을 확인(보통 1초 = 1억번) 한 뒤에 브루트 포스 를 적용해야할 것입니다. 

 

세 명의 수포자가 시험을 진행하는 모의고사 문제설명과 답안 코드, 그리고 다른 사람들의 좋은 답안예시를 공유하도록 하였습니다. 


모의고사 문제의 설명 

 


● 답안 코드

public class maxCorrect {

    public int[] solution(int[] answers) {

        int[] answer = {};
        int stu1, stu2, stu3;
        stu1 = 0;
        stu2 = 0;
        stu3 = 0;

        // 인덱스 다시돌기 -> % 10, %8
        int[] supo1 = {1,2,3,4,5,1,2,3,4,5};
        int[] supo2 = {2,1,2,3,2,4,2,5};
        int[] supo3 = {3,3,1,1,2,2,4,4,5,5};

        // 정답의 빈도 수 구하는 연산(문제풀이 할 때 answers 를 answer으로 잘못 표기. 동작하는코드 디버깅하고 있었음..)
        for(int i = 0; i < answers.length; i++) {

            int indexOfTen = i % 10;
            int indexOfEight = i % 8;

            if (supo1[indexOfTen] == answers[i]) stu1++;
            if (supo2[indexOfEight] == answers[i]) stu2++;
            if (supo3[indexOfTen] == answers[i]) stu3++;
        }
        // 1번 수포자가 가장 많이 맞춘 경우
        if ((stu1 > stu2) && (stu1 > stu3)) {
            answer = new int[1];
            answer[0] = 1;
            return answer;
        }
        // 2번 수포자가 가장 많이 맞춘 경우
        else if((stu2 > stu1) && (stu2 > stu3)) {
            answer = new int[1];
            answer[0] = 2;
            return answer;
        }
        // 3번 수포자가 가장 많이 맞춘 경우
        else if((stu3 > stu1) && (stu3 > stu2)) {
            answer = new int[1];
            answer[0] = 3;
            return answer;
        }
        // 1,2번 수포자가 가장 많이 맞춘 경우
        else if((stu1 == stu2) && (stu1 > stu3)) {
            answer = new int[2];
            answer[0] = 1;
            answer[1] = 2;
            return answer;
        }
        // 1,3번 수포자가 가장 많이 맞춘 경우
        else if((stu1 == stu3) && (stu1 > stu2)) {
            answer = new int[2];
            answer[0] = 1;
            answer[1] = 3;
            return answer;
        }
        // 2,3번 수포자가 가장 많이 맞춘 경우
        else if ((stu2 == stu3) && (stu2 > stu1)) {
            answer = new int[2];
            answer[0] = 2;
            answer[1] = 3;
            return answer;
        }
        // 모든 수포자가 가장 많이 맞춘 경우
        else {
            answer = new int[3];
            answer[0] = 1;
            answer[1] = 2;
            answer[2] = 3;
            return answer;
        }
    }
}

 

 

  


문제를 풀이하는 중간에 if-else if-else  조건이 너무 길게 이어지는 바람에 다른 좋은방법은 없을까? 하다가 딱히 떠오르는게 없어 

일단은 제 나름대로의 논리대로 문제를 풀이하고, 정답판정을 받은 뒤에 다른사람들의 풀이를 확인해보았습니다.

(정말 직관적이고, 알고리즘적으로도 효율적이게 코드를 짜내신 분들이 많더라구요.. 아오 저는 왜 이모냥

다른분들이 풀이하셨던 것 보면서 아쉬운점과 이것저것을 비교해보기에 좋았습니다.

'모의고사' 문제 다른답안 확인하러가기 : https://programmers.co.kr/learn/courses/30/lessons/42840/solution_groups?language=java

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

해당 프로그램의 시간복잡도 : 

 

반응형