Algorithm/Java

프로그래머스 - 성격 유형 검사하기 :: 2022 KAKAO TECH INTERNSHIP :: 118666

고고마코드 2022. 8. 26. 15:11
반응형

문제 링크

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


문제 이해하기

  • 성격 유형 종류는 총 8개로 고정이다.
    지표 번호 성격 유형
    1번 R, T
    2번 C, F
    3번 J, M
    4번 A, N

  • 점수는 총 7개로 분류된다.
    • 매우 비동의, 비동의, 약간 비동의, 모르겠음, 약간 동의, 동의, 매우 동의
    • 단, input 데이터에 따라 어느 곳에 점수를 부여해야 하는지 달라진다.

  • 배열 survey에는 성격 유형 종류 8개 중 각 지표가 쌍으로 들어간다.
    • 각 지표끼리만 입력 받을 수 있고 지표내의 성격 유형 순서는 바뀔 수 있다.
      • R, F: 이런 지문은 존재하지 않는다.
      • (R, T, T, R) 각 지문의 성격 유형 순서는 바뀔 수 있다.

  • 배열 surveychoices의 요소는 1vs1로 매칭되는 요소이다.

  • 점수는 세 가지 상황으로 분류할 수 있다.
    • choices의 값이 4를 기준으로 미만, 같음, 초과 으로 분류한다.
    • choices의 값이 4 미만
      • ("AN", 1): A에 3점
      • ("AN", 2): A에 2점
      • ("AN", 3): A에 1점
    • choices의 값이 4와 같음
      • ("AN", 4): 0점이므로 점수 부여하지 않음.
    • choices의 값이 4 초과
      • ("AN", 5): N에 1점
      • ("AN", 6): N에 2점
      • ("AN", 7): N에 3점

문제 풀이

map을 활용해 각 성격 유형의 수를 구합니다.

Map<String, Integer> map = new HashMap<>();
for (int i = 0; i < survey.length; i++) {
    String sv = new String();
    int choice = choices[i] - 4;
    if (choice < 0) {
        sv = String.valueOf(survey[i].charAt(0));
        choice = Math.abs(choice);
    } else if (choice > 0) {
        sv = String.valueOf(survey[i].charAt(1));
    }
    if (!sv.isEmpty()) map.put(sv, map.getOrDefault(sv, 0) + choice);
}
  • 세 가지 상황에 맞게 점수를 분류
  • map.getOrDefault(sv, 0)
    map 내에 저장된 sv가 있으면 sv의 값을 가져오고, 없으면 0을 반환

성격 유형 구하기

public String getMBTI(Map<String, Integer> map) {
    String[] mbtiGroup = { "RT", "CF", "JM", "AN" };
    String mbti = new String();
    for(String mg : mbtiGroup) {
        String first = String.valueOf(mg.charAt(0));
        String second = String.valueOf(mg.charAt(1));
        int score = map.getOrDefault(first, 0) - map.getOrDefault(second, 0);
        String pick = score < 0 ? second : first;

        mbti += pick;
    }

    return mbti;
}
  • mbtiGroup
    각 성격유형을 사전 순서대로 정렬한 배열 (지표별로)
  • map.getOrDefault(first, 0)
    map 내에 first가 있으면 first의 값을 반환하고, 없으면 0을 반환
  • 만약 점수가 같으면 first 반환 (사전 순으로 더 빠르기 때문에)

전체 코드

import java.util.HashMap;
import java.util.Map;

class Solution118666 {
    public String solution(String[] survey, int[] choices) {
        Map<String, Integer> map = new HashMap<>();
        for (int i = 0; i < survey.length; i++) {
            String sv = new String();
            int choice = choices[i] - 4;
            if (choice < 0) {
                sv = String.valueOf(survey[i].charAt(0));
                choice = Math.abs(choice);
            } else if (choice > 0) {
                sv = String.valueOf(survey[i].charAt(1));
            }
            if (!sv.isEmpty()) map.put(sv, map.getOrDefault(sv, 0) + choice);
        }

        System.out.println(map);

        return getMBTI(map);
    }

    public String getMBTI(Map<String, Integer> map) {
        String[] mbtiGroup = { "RT", "CF", "JM", "AN" };
        String mbti = new String();
        for(String mg : mbtiGroup) {
            String first = String.valueOf(mg.charAt(0));
            String second = String.valueOf(mg.charAt(1));
            int score = map.getOrDefault(first, 0) - map.getOrDefault(second, 0);
            String pick = score < 0 ? second : first;

            mbti += pick;
        }

        return mbti;
    }
반응형