프로그래머스-2022 KAKAO TECH INTERNSHIP(성격 유형 검사하기)

Flash·2023년 1월 26일
0

Programmers-Algorithm

목록 보기
44/52
post-thumbnail

구현

프로그래머스 2022 KAKAO TECH INTERNSHIP Level 1 문제 성격 유형 검사하기Java를 이용해 풀어보았다.
다들 HashMap을 이용해서 풀었던데 나는 그냥 구현으로 풀어보았다. 기존 코드에서 좀 더 간결하게 만들어보려고 한다.

문제 링크 첨부한다.
https://school.programmers.co.kr/learn/courses/30/lessons/118666


무식하게 풀기

다들 올려둔 풀이대로 HashMap을 이용하면 깔끔하고 멋진 풀이가 가능하다. 하지만 나는 시간 들여 깔끔한 풀이로 풀진 않았고, 시간 제한을 두고 실제 시험에서의 상황을 가정하고 생각나는 대로 빠르게 풀어보았더니 좀 길게 힘으로 밀어 붙이듯이 풀었다.

코드는 다음과 같다.

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        int[][] score = new int[4][2];
        
        int length = survey.length;
        
        for(int i=0; i<length; i++){
            String s = survey[i];
            int n = choices[i];
            
            if(n==4)    continue;
            
            int realScore = Math.abs(4-n);
            
            switch(s){
                case "RT":
                    if(n<4) score[0][0] += realScore;
                    else    score[0][1] += realScore;
                    break;
                    
                case "TR":
                    if(n<4) score[0][1] += realScore;
                    else    score[0][0] += realScore;
                    break;
                    
                case "CF":
                    if(n<4) score[1][0] += realScore;
                    else    score[1][1] += realScore;
                    break;
                    
                case "FC":
                    if(n<4) score[1][1] += realScore;
                    else    score[1][0] += realScore;
                    break;
                    
                case "JM":
                    if(n<4) score[2][0] += realScore;
                    else    score[2][1] += realScore;
                    break;
                    
                case "MJ":
                    if(n<4) score[2][1] += realScore;
                    else    score[2][0] += realScore;
                    break;
                    
                case "AN":
                    if(n<4) score[3][0] += realScore;
                    else    score[3][1] += realScore;
                    break;
                    
                case "NA":
                    if(n<4) score[3][1] += realScore;
                    else    score[3][0] += realScore;
                    break;
            }
        }
        
        String[][] ary = { {"R", "T"}, {"C", "F"}, {"J", "M"}, {"A", "N"} };
        
        for(int i=0; i<4; i++){
            int tmp = score[i][0] - score[i][1];
            
            if(tmp>=0){ // 사전순
                answer += ary[i][0];
            }
            else{ // 역순
                answer += ary[i][1];
            }
        }
        
        return answer;
    }
}

반복되는 코드가 상당히 더럽다 ㅎㅎ.. 하지만 실제 풀이시간은 13분 남짓 되었기에 Level 1 문제에서는 크게 신경 쓸 필요 없이 빠르게 푸는 게 더 중요한 것 같긴 하다.


코드 줄이기

만약 위의 풀이의 큰 틀을 바꾸지 않은 채 코드를 줄이고 싶다면... 결국 HashMap 을 써야하는 결론이 났다. 위와 같이 각 케이스별로 모두 개별적으로 처리해주지 않으려면, 각 문자별로 값을 저장해줘야 하는데 그럴 때 사용할 수 있는 자료구조는 Map 구조 외에 생각나지 않는다. 그래서 그냥 이대로 두려고 한다... HashMap을 쓸 생각이 시험장에서 난다면 그리 풀고 아니면 그냥 힘으로 욱여 푸는 것으로..

profile
개발 빼고 다 하는 개발자

0개의 댓글