본문 바로가기
Algorithm/프로그래머스 고득점 Kit

[완전탐색] 모의고사 - Java 풀이

https://programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자가 찍는

programmers.co.kr

 

문제

 

접근법

완전탐색, 브루트포스는 결국 모든 경우에 수를 따져야하는 알고리즘이이다.

풀기 위해서는 무식해보이는 코딩을 할 수 밖에 없다.

1. 학생별로 반복되는 패턴을 배열에 담아서 맞춘수를 카운트해주고,

2. 맞춘수 중에서 Math.max를 이용해 최댓값을 구해, 제일 많이 맞춘 학생들을 추려내서 배열에 넣어준다.

3. 배열은 크기를 지정해야하는 특성상 정답학생을 담아줄 List를 중간지 Temp 자료구조로 활용해 정답배열 리턴.

 

풀이

 public int[] solution(int[] answers) {
        int[] s1= {1,2,3,4,5}; //5
        int[] s2= {2,1,2,3,2,4,2,5}; //8
        int[] s3= {3,3,1,1,2,2,4,4,5,5}; //10
        int a=0,b=0,c=0;
        for(int i=0;i<answers.length;i++) {
        	if(answers[i]==s1[i%5])
        		a++;
        	if(answers[i]==s2[i%8])
        		b++;
        	if(answers[i]==s3[i%10])
        		c++;
        }        
        int max = Math.max(Math.max(a, b), c);

        List<Integer> list = new ArrayList<>();
        if(max==a)	list.add(1);
        if(max==b) 	list.add(2);
        if(max==c)	list.add(3);
        
        int[] arr = new int[list.size()];
        for(int i =0; i<arr.length; i++) 
        	arr[i] = list.get(i);
        return arr;
    }

 

이게 최선일까 싶으면서 풀었다.

TreeMap 이나, HashMap을 이용해 학생 3명이 아닌경우 어떻게 일반화시킬지 생각하다보니 너무 시간을 많이 쏟았다.

지금보니 코드에 5, 8, 10 등과 같이 들어간 하드코딩이 보인다. 모두 length를 써야겠다.

 

다른 사람의 풀이

import java.util.ArrayList;
class Solution {
    public int[] solution(int[] answer) {
        int[] a = {1, 2, 3, 4, 5};
        int[] b = {2, 1, 2, 3, 2, 4, 2, 5};
        int[] c = {3, 3, 1, 1, 2, 2, 4, 4, 5, 5};
        int[] score = new int[3];
        for(int i=0; i<answer.length; i++) {
            if(answer[i] == a[i%a.length]) {score[0]++;}
            if(answer[i] == b[i%b.length]) {score[1]++;}
            if(answer[i] == c[i%c.length]) {score[2]++;}
        }
        int maxScore = Math.max(score[0], Math.max(score[1], score[2]));
        ArrayList<Integer> list = new ArrayList<>();
        if(maxScore == score[0]) {list.add(1);}
        if(maxScore == score[1]) {list.add(2);}
        if(maxScore == score[2]) {list.add(3);}
        return list.stream().mapToInt(i->i.intValue()).toArray();
    }
}

 

Stream 이용하시다니, 멋있다. 간결하지만 , 효율성은 많이 떨어진다고 한다.

자바 어느정도 공부했다 싶었는데 ,

왜 다른사람의 코드볼때마다, 

자바 공부에 왜 끝이 없는것 같지...ㅜㅜ