본문 바로가기
Algorithm Practice/Programmers

[Programmers] 성격 유형 검사하기 (Java)

by 1000zoo 2023. 9. 27.

문제링크

문제요약

RT, CF, JM, AN 총 4 가지 지표가 있고, 1~7에 따라 각 지표의 점수가 부여된다.
1 ~ 7 은 각각 \[매우 비동의, 비동의, 약간, 보통, 약간, 동의, 매우] 이런식이다.
지표의 순서는 바뀔 수 있고, 앞에오는 것이 비동의에 해당하고, 뒤에오는 것이 동의에 해당한다.
예를 들어, RT, 2 가 들어오면, R이 2점 획득한다.

접근방법

Map을 만들어, 각각에 해당되는 유형들의 점수를 기록한다.
choice - 4 를 하게되면, 비동의에 해당되는 것들은 음수, 그 외는 양수가 된다.
따라서 만약 음수라면, survey의 첫번째 유형에 점수를 부여하고, 아니면 두번째 유형에 점수를 부여한다.
이렇게 하면 map에는 각 유형에 해당되는 점수들이 기록된다.
마지막으로 유형들을 유형순서, 알파벳 순서로 묶어놓은 배열을 2칸 씩 돌면서, 비교를 하고 answer에 추가한다.

코드

Java

import java.util.*;

class Solution {
    public String solution(String[] survey, int[] choices) {
        String answer = "";
        Map<Character, Integer> map = new HashMap<>();
        char[] category = {'R', 'T', 'C', 'F', 'J', 'M', 'A', 'N'};
        for (char c : category) {
            map.put(c, 0);
        }
        
        for (int i = 0; i < survey.length; i++) {
            recordScore(map, survey[i], choices[i]);
        }
        
        for (int i = 0; i < category.length; i += 2) {
            answer += map.get(category[i]) >= map.get(category[i + 1]) ? category[i] : category[i + 1];
        }
        
        return answer;
    }
    
    private void recordScore(Map<Character, Integer> map, String survey, int choice) {
        int score = choice - 4;
        if (score == 0) return;
        int i = Math.max(Integer.compare(score, 0), 0);
        char c = survey.charAt(i);
        map.put(c, map.get(c) + Math.abs(score));
    }
}