ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 성격 유형 검사하기(카카오)
    알고리즘 2023. 2. 8. 15:39

    문제

    나만의 카카오 성격 유형 검사지를 만들려고 합니다.
    성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.

    지표 번호 성격 유형
    1번 지표 라이언형(R), 튜브형(T)
    2번 지표 콘형(C), 프로도형(F)
    3번 지표 제이지형(J), 무지형(M)
    4번 지표 어피치형(A), 네오형(N)
    4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, "RFMN"이나 "TCMA"와 같은 성격 유형이 있습니다.

    검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.

    매우 비동의
    비동의
    약간 비동의
    모르겠음
    약간 동의
    동의
    매우 동의
    각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.

    예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 있습니다.

    선택지성격 유형점수

     

    매우 비동의 네오형 3점
    비동의 네오형 2점
    약간 비동의 네오형 1점
    모르겠음 어떤 성격 유형도 점수를 얻지 않습니다  
    약간 동의 어피치형 1점
    동의 어피치형 2점
    매우 동의 어피치형 3점

     

    이때 검사자가 질문에서 약간 동의 선택지를 선택할 경우 어피치형(A) 성격 유형 1점을 받게 됩니다.
    만약 검사자가 매우 비동의 선택지를 선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.

    위 예시처럼 네오형이 비동의, 어피치형이 동의인 경우만 주어지지 않고, 질문에 따라 네오형이 동의, 어피치형이 비동의인 경우도 주어질 수 있습니다.
    하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.

    매우 동의나 매우 비동의 선택지를 선택하면 3점을 얻습니다.
    동의나 비동의 선택지를 선택하면 2점을 얻습니다.
    약간 동의나 약간 비동의 선택지를 선택하면 1점을 얻습니다.
    모르겠음 선택지를 선택하면 점수를 얻지 않습니다.
    검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다.
    단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.

    질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어집니다.
    이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.

    제한사항
    1 ≤ survey의 길이 ( = n) ≤ 1,000
    survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.
    survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
    survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
    choices의 길이 = survey의 길이

    choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미합니다.
    1 ≤ choices의 원소 ≤ 7

    choices뜻

    1 매우 비동의
    2 비동의
    3 약간 비동의
    4 모르겠음
    5 약간 동의
    6 동의
    7 매우 동의

    입출력 예

    surveychoicesresult

    "AN", "CF", "MJ", "RT", "NA" 5, 3, 2, 7, 5 "TCMA"
    "TR", "RT", "TR" 7, 1, 3 "RCJA"

    풀이

    일단 나의 풀이는 성능을 고려 하지 않고 문제에 충실히 입각하여 구현해본 풀이다...
    코드를 굉장히 직관적으로 짜놓았 다는 것이 장점이지만...

    각 항목별로 항목과 그에 따른 점수를 저장해야하므로 Map 구조를 사용하기로 했다.
    설문 조사는 순서대로 주어지지 않는다.
    RT -> CF ->... 순서대 아닐뿐 더러, RT설문 조사 후에 TR설문 조사가 나올 수도 있다.
    따라서 각 항목을 누적해서 계산해야 한다.

    우선 점수를 써놓은 배열을 통해서 설문조사에 대한 답변을 가져와 그 인덱스로 해당 점수를 구하도록 하였다.
    "RT" 설문조사이면 문자를 R과 T로 쪼개어 해당 답변의 범위를 나누어 점수를 저장 할 수 있도록 하였다.

    이후 점수 기록이 모두 끝나면, 결과는 주어진 순서대로 계산하도록 해야 한다.
    따라서 해당 기록 순서를 또한 배열로 나타내어 이를 가져와서 순서대로 처리하도록 하였다.

    시간이 오래 걸렸던 것은 getOrDefault...인데, 사용법을 완전히 익히고 가지 않아서 get과 계속 혼돈하여 사용하여서
    디버깅 하는데 시간이 오래 걸렸다는 것...
    제발 잘 알고 쓰자ㅜㅜ

     

    import java.util.*;
    import java.lang.*;
    
    class Solution {
        static int[] score = {3,2,1,0,1,2,3};
        static String[] elem = {"RT", "CF", "JM", "AN"};
        
        public String solution(String[] survey, int[] choices) {
            StringBuilder answer = new StringBuilder();
            Map<String, Integer> surveyMap = new HashMap<>();
            
            for(int i = 0; i < survey.length; i++) {
                String left = survey[i].substring(0,1);
                String right = survey[i].substring(1,2);
                int scoreIndex = choices[i] - 1;
                
                if (scoreIndex < 3) {
                    surveyMap.put(left, 
                                  surveyMap.getOrDefault(left, 0) + score[scoreIndex]);
                } else if (scoreIndex > 3) {
                 surveyMap.put(right, 
                                  surveyMap.getOrDefault(right, 0) + score[scoreIndex]);   
                }
            }
            
            for(String str : elem) {
                getResult(answer, surveyMap, str);
            }
            
            
            return answer.toString();
        }
        
        static public void getResult(StringBuilder answer, Map<String, Integer> surveyMap, String survey) {
            String left = survey.substring(0, 1);
            String right = survey.substring(1, 2);
            
            int leftValue = surveyMap.getOrDefault(left, 0);
            int rightValue = surveyMap.getOrDefault(right, 0);
            
            if (leftValue > rightValue) {
                answer.append(left);
                return;
            } else if(leftValue < rightValue) {
                answer.append(right);
                return;
            }
            
            if (left.compareTo(right) <= 0) {
                answer.append(left);
            } else {
                answer.append(right);            
            }
        }
    }

     

     

    https://github.com/Win-9/Algorism/tree/main/programers/%EC%84%B1%EA%B2%A9%20%EC%9C%A0%ED%98%95%20%EA%B2%80%EC%82%AC%ED%95%98%EA%B8%B0(%EC%B9%B4%EC%B9%B4%EC%98%A4)

    728x90

    댓글

Designed by Tistory.