[2021-05-01] 모의고사

2021. 5. 1. 18:38코딩테스트

푼 시간 : 2시간

언어 : 자바

 


 

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

 

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

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

programmers.co.kr

 

완전 탐색이라는 풀이법을 알고는 있었지만

완전탐색의 기법에 있는 알고리즘에 기반해서 풀었는지는 잘 모르겠다.

이렇게까지 시간이 오래 걸릴줄은 몰랐다.

처음으로 그림을 그려가면서 푼 문제였다.

머릿속에만 그리기에는 너무 복잡했기때문에, 그림을 그려가면서 푸는 수가 제일 좋은 것 같았다.

 

풀면서 고민한 흔적들

좋은 방향으로 작용 했던 것 같다.

변수를 너무 많이 만들어 낭비가 심했던 것 같지만, 어쩔수없다고 생각하고 있다.

다음에는 좀 더 가독성이 좋으면서도( 완전탐색을 풀때 가독성이 좋게 만들 방법을 생각하기 힘들겠지만)

더 낭비가 없는 코드를 만들고 싶다.

 

그리고 다른 분들이 푼 유형을 보니

if(answers[i] == a[(i+1)%5]) arr[0]++;

if(answers[i] == b[(i+1)%8]) arr[1]++;

if(answers[i] == c[(i+1)%10]) arr[2]++;

이런식으로 분류했던데.. 나도 나름 열심히 생각한건데 ㅠㅠ

저걸 보니 아직 분류할때 부족하구나 라고 느꼈다.

 

그리고 풀다보니 해시나 어레이리스트를 정말 사용하고싶었다.

이미 1차원적인 방법으로 시간을 오래 보낸 터라, 그냥 풀었지만

기왕 푼다면 어레이리스트같이 정적인 자료구조를 사용하는게 좋을 것 같다.

 

class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};
        int[][] students = {{1, 2, 3, 4, 5}, {2, 1, 2, 3, 2, 4, 2, 5},
                {3, 3, 1, 1, 2, 2, 4, 4, 5, 5}};
        int[] compare = new int[students.length];
        int count=0;
        int max=0;
        
        for(int i=0; i<students.length; i++){
            for(int j=0; j<answers.length; j++){
                if(count==students[i].length)
                    count=0;
                if(answers[j]==students[i][count])
                    compare[i]+=1;
                count++;
                // 카운트를 써서, students의 답안 갯수가 다르다고 하더라도,
                걸러낼 수 있도록 코드를 짰다. 다른 분들과는 많이 다른 1차원적인
                방식으로 푼 것 같다.
            }
            count=0;
            // 카운트를 초기화시키지 않으면 위에 if에서
            걸리지않고 종료될 수 있기에, 카운트를 초기화시켰다.
        }
        
        max=compare[0];				
        // max를 찾기위해 compare의 0번째를 넣어 비교
        count=0;
        
        for(int i=1; i<compare.length; i++) {
        	if(max<compare[i])
        		max=compare[i];
                // max보다 compare i가 클경우 max에 넣어준다
        }
        
        for(int i=0; i<compare.length; i++) {
        	if(max==compare[i])
        		count++;
                // 1차원적이라고 또 느낀 부분.. 생각이 안나
                compare과 max가 맞으면 count쳤다.
        }
        
        answer=new int[count];		// 배열은 항상 범위가 필요하다.
        count=0;
        
        for(int i=0; i<compare.length; i++) {
        	if(max==compare[i]) {
        		answer[count]=i+1;
        		count++;
                // 여기서 많이 고민했는데, 다 맞추면 [1, 2, 3] 맞춘사람 만큼만 배열을
                만들어야 했다. 그런데 카운트는 어떻게..? 하다 보니 그냥 answer[count]를
                주고 i+1로 때려박아 버렸다.
                여기서 많이 때려치우고 어레이리스트나, 해시를 쓸까 했지만
                그냥 기왕 푸는김에 풀었다.
        	}
        }
        
        return answer;
    }
}

'코딩테스트' 카테고리의 다른 글

[2021-05-05] 소수 찾기  (0) 2021.05.05
[2021-05-03] 음양 더하기  (0) 2021.05.03
[2021-04-29] K번째 수  (0) 2021.04.29
[2020-12-01] 하샤드 수  (0) 2020.12.01
[2020-11-26] 콜라츠 추측  (0) 2020.11.26