본문 바로가기
개발로그/알고리즘

프로그래머스 Lv.1 성격 유형 검사하기

by 쩜징 2023. 7. 6.

프로그래머스 Lv.1 성격 유형 검사하기


[2022 KAKAO TECH INTERSHIP] Lv.1 성격 유형 검사하기

 

오늘은 알고리즘 스터디 때

제한시간 내에 풀지 못한 문제를

다시 한 번 풀이해보려고 한다.

 

카카오는 문제 자체가 신선하고 재밌는 것이 많다.

하지만 이게 리얼 Lv.1 수준의 문제인지 의심이 드는,,

갈 길이 멀다! 어쨌든 스타트


문제설명과 예시

4개의 지표로 검사자의 성격 유형을 구분한다. (survey[ ])

성격은 각 지표의 두 유형 중 하나로 결정된다.

지표 번호 성격 유형
1번 지표 라이언형(R), 튜브형(T)
2번 지표 콘형(C), 프로도형(F)
3번 지표 제이지형(J), 무지형(M)
4번 지표 어피치형(A), 네오형(N)

검사지에는 총 7개의 선택지가 있다.  (choices[ ])

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

선택지 점수
매우 동의 / 비동의 3점
동의 / 비동의 2점
약간 동의 / 비동의 1점
모르겠음 0점

주어진 survey[ ]의 원소 중 앞의 문자는 비동의를 선택했을 경우! 뒤의 문자는 동의를 선택했을 경우!

ex) survey = ["TR"]   choices=[7]   7번 선택지는 매우 동의이므로 TR 중 뒷 문자인 R의 점수가 3점 추가된다.

모든 질문의 점수를 더하여 각 지표에서 높은 점수를 받은 유형으로 성격 유형이 결정된다.

(단, 하나의 지표에서 각 성격 유형 점수가 같으면, 사전 순으로 빠른 유형으로 결정된다.)

 

입출력 예

survey choices result
["TR", "RT", "TR"] [7, 1, 3] "RCJA"

7번 : 매우 동의 → 동의를 선택했으므로 "TR" 중 R유형에 3점이 추가된다. 

1번 : 매우 비동의 → 비동의를 선택했으므로 "RT" 중 R유형에 3점이 추가된다. 

3번 : 약간 비동의 → 비동의를 선택했으므로 "TR" 중 T유형에 1점이 추가된다.

지표 번호 성격 유형 점수 총합
1번 지표 라이언형(R), 튜브형(T) R=6, T=1
2번 지표 콘형(C), 프로도형(F) C=0, F=0
3번 지표 제이지형(J), 무지형(M) J=0, M=0
4번 지표 어피치형(A), 네오형(N) A=0, N=0

1번 지표에서 가장 점수가 높은 R유형이 채택 되고,

나머지 지표에서는 점수가 모두 0점이므로 사전 순으로 빠른 순서의 유형이 성격 유형이 된다.

결과적으로 "RCJA"가 검사자의 성격 유형이 된다.


나의 풀이 과정!

제한 시간은 30분이였고, 문제를 이해하는 데만 20분 정도 소요가 되었다.

그래서 나머지 10분동안은 이걸 어떻게 코드로 풀어나가야 할 지 생각해 보았다.

제한 시간이 끝나고,

다른 팀원분들의 코드 리뷰를 통해 다양한 풀이 방법을 보며 감을 잡을 수 있었다.

 

선택지별 점수 환산 방법

우선 1,7번 / 2,6번 / 3,5번이 쌍으로 같은 점수를 가지므로,

4번 "모르겠음"선택지를 기준으로

4번 미만은 각 선택지 번호의 -4를 한 절대값과 같고,

4번 이후로는 -4한 값으로 점수가 나온다.

 

성격유형 문자 접근 방법

그리고,

4번 미만은 비동의이므로 survey 원소의 앞 문자

4번 이후는 동의이므로 survey원소의 뒷 문자에 점수를 추가할 수 있다.

각 선택지에 따라 앞/뒷문자로 접근하기 위해 charAt()을 사용했다.

 

점수 저장하는 방법

점수를 저장하는 방식은 HashMap을 사용해

key값으로 각 성격 유형을 저장하고, value값으로 점수를 저장한다.

 

최종 성격 유형 추출

모든 점수가 반영이 되고,

HashMap에서 점수 값을 가져와 각 지표의 점수를 비교한다.

점수가 같으면 사전 순으로 빠른 순서가 채택이 되므로,

미리 사전 순으로 배치 되게끔 설정해준다. 

 

최종 코드!

import java.util.*;
class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        HashMap<Character,Integer> map = new HashMap<>();
        //각 성격유형 저장 (점수는 0으로 초기화)
        map.put('R',0);
        map.put('T',0);
        map.put('C',0);
        map.put('F',0);
        map.put('J',0);
        map.put('M',0);
        map.put('A',0);
        map.put('N',0);
        
        for (int i=0; i<choices.length; i++) {
        	//4번 선택지 미만으로 선택(비동의)
            if (choices[i] < 4) {
            	//점수 = 4 - 선택지번호
                int score = map.get(survey[i].charAt(0)) + 4 - choices[i];
                //앞문자에 해당하는 유형의 점수를 추가한다.
                map.put(survey[i].charAt(0), score);
            
          	//4번 선택지 이후로 선택(동의)
            } else if (choices[i]>4) {
                    //점수 = 선택지번호 - 4
                    int score = map.get(survey[i].charAt(1))+choices[i]-4;
                    //뒷문자에 해당하는 유형의 점수를 추가한다.
                    map.put(survey[i].charAt(1),score);       
            }
        }
        	//같을 경우 사전상 빠른 순서로 출력됨
            answer+=(map.get('R')>=map.get('T'))?'R':'T';
            answer+=(map.get('C')>=map.get('F'))?'C':'F';
            answer+=(map.get('J')>=map.get('M'))?'J':'M';
            answer+=(map.get('A')>=map.get('N'))?'A':'N';        
            
        return answer;
    }
}

 

반응형

댓글