본문 바로가기

공부/예제 풀이

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

사기 자료구조 map을 썼다. key값으로 mbti의 요소를 넣고, value값으로 해당 요소의 점수를 넣어주는 식.

점수를 4점을 기준으로 빼준다. 이때 음수값이라면 map에 해당 지문의 왼쪽 mbti 요소로 넣어준다.(value값은 절대값을 취해야 하므로 -를 붙여줌) 양수라면 해당 지문의 오른쪽 mbti 요소로 넣어줌.

 

마지막으로 String을 붙여줄 땐 전에 배웠듯이 StringBuilder의 append() 메서드를 사용해줬다.

문자열 출력 방식은 문제에서 주어진 순서로!

 

풀이

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
// 맵으로 mbti 한개당 벨류 넣기
// 벨류 넣는 방법 4-choice의 절대값.
// 비교하는 ex) an, cf, rt중 큰걸 붙여주기
class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        StringBuilder sb = new StringBuilder();
        Map<Character, Integer> map = new HashMap<>();
        // map 초기화
        map.put('A',0);
        map.put('N',0);
        map.put('C',0);
        map.put('F',0);
        map.put('M',0);
        map.put('J',0);
        map.put('R',0);
        map.put('T',0);
        // mbti요소 별 벨류 할당
        int score;
        for(int i =0;i<choices.length;i++){
            score = choices[i]-4;
            if(score<0){
                map.put(survey[i].charAt(0),map.get(survey[i].charAt(0)) -score);
            }else if(score>0){
                map.put(survey[i].charAt(1),map.get(survey[i].charAt(1)) +score);
            }
        }
        
        // 맵 확인용 출력
        for (Entry<Character, Integer> entrySet : map.entrySet()) {
            System.out.println(entrySet.getKey() + " : " + entrySet.getValue());               }
        
        // mbti 결과 출력 [AN/RT/CF/JM]
        if(map.get('R')>=map.get('T')){
            sb.append('R');
        }else sb.append('T');
        
        if(map.get('C')>=map.get('F')){
            sb.append('C');
        }else sb.append('F');
        
        if(map.get('J')>=map.get('M')){
            sb.append('J');
        }else sb.append('M');
        
        if(map.get('A')>=map.get('N')){
            sb.append('A');
        }else sb.append('N');

        answer = sb.toString();
        return answer;
    }
}