[프로그래머스] 성격 유형 검사하기

fsm12·2023년 7월 17일
0

프로그래머스

목록 보기
39/57
post-thumbnail
post-custom-banner

문제링크

문제 이해

[ 입력형태 / 조건 ]

survey
질문마다 판단하는 지표를 담은 1차원 문자열 배열 | ["AN", "CF", "MJ", "RT", "NA"] | 1 ≤ survey의 길이 ( = n) ≤ 1,000, survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나, survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미, survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미

choices
컴퓨터 바탕화면의 상태를 나타낸 문자열 배열 | [5, 3, 2, 7, 5] | choices의 길이 = survey의 길이, choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미, 1 ≤ choices의 원소 ≤ 7

[ 문제 ]

검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return

[ 풀이 ]

Map에 유형별 점수를 카운트하고, 각 점수를 비교하여 유형을 계산



코드

> [성공] 1차 시도 : Map 이용

  • 생각한 풀이 그대로 구현
import java.util.*;

class Solution {
    public String solution(String[] survey, int[] choices) {
        Map<Character, Integer> map = new HashMap<>();
        
        int N = survey.length;
        for(int n=0; n<N; n++){
            if(choices[n] == 0)
                continue;
            if(choices[n] < 4){
                char c = survey[n].charAt(0);
                map.put(c, map.getOrDefault(c, 0) + 4-choices[n]);
            }else{
                char c = survey[n].charAt(1);
                map.put(c, map.getOrDefault(c, 0) + choices[n]-4);
            }
        }
        
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<4; i++){
            sb.append(choose_type(map, i*2));
        }
        
        return sb.toString();
    }
    
    public static char choose_type(Map<Character, Integer> map, int std){
        char[] type = new char[]{'R','T','C','F','J','M','A','N'};
        
        int firCnt = map.getOrDefault(type[std], 0);
        int secCnt = map.getOrDefault(type[std+1], 0);
        
        if(secCnt <= firCnt)
            return type[std];
        return type[std+1];
    }
}



Tip : 반복되는 부분이 많을 경우, 사용자 정의 함수로 구현해서 가독성을 높이는 것이 좋은 방법이다.

post-custom-banner

0개의 댓글