https://school.programmers.co.kr/learn/courses/30/lessons/118666

 

프로그래머스

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

programmers.co.kr

문제 풀이 (JAVA) - 개선 전

import java.util.*;

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        HashMap<String,Integer> map = new HashMap<>(); // 성격 유형 저장 맵
        HashMap<Integer,Integer> choiceMap = new HashMap<>(); // 설문 번호 저장 맵
        String [] alphs = {"R","T","C","F","J","M","A","N"}; // 성격 유형 문자 배열
        for(int i=0; i<alphs.length; i++){
            map.put(alphs[i],0); // 성격 유형 맵 선언 및 초기화
        }
        
        // 설문 번호 맵 선언 및 초기화
        for(int i=1, j=3; i<8; i++){
            if(i<4){
                choiceMap.put(i,j);
                j--;
            }else if(i==4){
                choiceMap.put(i,j);
            }else if(i>4){
                j++;
                choiceMap.put(i,j);
            }
        }
        
        // 성격 유형 점수 저장 로직
        for(int i=0; i<survey.length; i++){
            String [] values = survey[i].split(""); // values[0] = 왼쪽 문자, values[1] = 오른쪽 문자
            int num = choices[i]; // 설문 번호
            if(num < 4){
                map.put(values[0], map.getOrDefault(values[0],0)+choiceMap.get(num));
            }else{
                map.put(values[1], map.getOrDefault(values[1],0)+choiceMap.get(num));
            }         
        }
        
        // 성격 유형 결과 저장 로직
        for(int i=0; i<alphs.length; i+=2){
            String lt = alphs[i];
            String rt = alphs[i+1];
            if(map.get(lt) > map.get(rt)){
                answer = answer + lt;
            }else if(map.get(lt) < map.get(rt)){
                answer = answer + rt;
            }else if(map.get(lt) == map.get(rt)){
                if((int)lt.toCharArray()[0] > (int)rt.toCharArray()[0]){
                    answer = answer + rt;
                }else{
                    answer = answer + lt;
                }
            }
        }
        
        return answer;
    }
}

 

 

문제 풀이 (JAVA) - 개선 후(코드 리팩토링)

import java.util.*;

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        HashMap<String,Integer> map = new HashMap<>(); // 성격 유형 저장 맵
        String [] alphs = {"R","T","C","F","J","M","A","N"}; // 성격 유형 문자 배열
        for(int i=0; i<alphs.length; i++){
            map.put(alphs[i],0); // 성격 유형 맵 선언 및 초기화
        }
        
        // 성격 유형 점수 저장 로직
        for(int i=0; i<survey.length; i++){
            String [] values = survey[i].split(""); // values[0] = 왼쪽 문자, values[1] = 오른쪽 문자
            int num = choices[i]; // 설문 번호
            if(num < 4){
                map.put(values[0], map.get(values[0]) + 4 - num);
            }else{
                map.put(values[1], map.get(values[1]) + num - 4);
            }         
        }
        
        // 성격 유형 결과 저장 로직
        for(int i=0; i<alphs.length; i+=2){
            String lt = alphs[i];
            String rt = alphs[i+1];
            if(map.get(lt) > map.get(rt)){
                answer = answer + lt;
            }else if(map.get(lt) < map.get(rt)){
                answer = answer + rt;
            }else if(map.get(lt) == map.get(rt)){
                if((int)lt.toCharArray()[0] > (int)rt.toCharArray()[0]){
                    answer = answer + rt;
                }else{
                    answer = answer + lt;
                }
            }
        }
        
        return answer;
    }
}

 

리팩토링 설명

: 처음 문제를 풀때 설문 번호에 따른 점수에서 규칙을 찾았지만, 활용 할 방법을 생각하지 못하여 choiceMap 해시맵 변수를 선언하여 (key,value) 형식으로 저장하였다. 문제를 다 풀고 다른 사람의 풀이를 보고 나서 불필요한 변수라는 것을 알았다.

기존에 성격 유형 점수를 저장하는 로직을

map.put(values[0], map.getOrDefault(values[0],0)+choiceMap.get(num));  -- 변경 전

map.put(values[1], map.getOrDefault(values[1],0)+choiceMap.get(num));

map.put(values[0], map.get(values[0]) + 4 - num); -- 변경 후

map.put(values[1], map.get(values[1]) + num - 4);

위와 같이 번호의 숫자가 4보다 작을때는 (기존값 + 4 - 설문번호),

번호의 숫자가 4보다 같거나 클경우 (기존값 + 설문번호 - 4) 의 규칙으로 점수를 매길 수 있었다.

때문에 설문 번호 맵을 선언하고 초기화하는 불필요한 로직을 제거하여 보다 짧은 코드로 문제를 해결 할 수 있다는 것을 알았다.

 

결론

: 2022 카카오 인턴쉽 레벨 1 문제인데, 생각보다 어려웠다... 카카오는 알고리즘을 응용한 구현 문제가 출제 되므로 많이 풀어봐야겠다는 생각을 하였다.

'프로그래머스(JAVA)' 카테고리의 다른 글

게임 맵 최단거리(BFS)  (0) 2023.04.23
네트워크(인접리스트-DFS)  (0) 2023.04.23
체육복  (3) 2022.07.18
K번째 수  (0) 2022.07.18
구명 보트  (0) 2022.07.16

+ Recent posts