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

이나리·2023년 2월 11일
0

문제

https://school.programmers.co.kr/learn/courses/30/lessons/118666

입출력 예시

surveychoicesresult
["AN", "CF", "MJ", "RT", "NA"][5, 3, 2, 7, 5]"TCMA"
["TR", "RT", "TR"][7, 1, 3]"RCJA"

풀이

function solution(survey, choices) {
    const result = choices.reduce((acc, curr, i) => {
        if (curr === 4) return acc;
        if (curr < 4) {
            const first_character = survey[i][0];
            const score = 4 - curr;
            acc[first_character] += score;
            return acc;
        }
        
        if (curr > 4) {
            const second_character = survey[i][1];
            const score = curr - 4;
            acc[second_character] += score;
            return acc;
        }
    }, {
        R: 0,
        T: 0,
        C: 0,
        F: 0,
        J: 0,
        M: 0,
        A: 0,
        N: 0,
    });
    
    return ['RT', 'CF', 'JM', 'AN'].reduce((acc, curr) => {
        const first_character = curr[0];
        const second_character = curr[1];
        if (result[first_character] < result[second_character]) {
            return acc + second_character;
        } 
        if (result[first_character] > result[second_character]) {
            return acc + first_character;
        }
        return acc + first_character;
    }, '');
}

풀이 해석

  1. 각 문항에 따라 선택한 답변의 점수와 그 점수에 해당하는 성격 유형를 찾아내어 각 유형의 점수를 정리해야 한다.

총 8가지의 성격 유형이 존재하므로, 이 성격 유형들을 객체의 키로 저장하고 0으로 초기값을 설정한다.

어디에도 해당하지 않는 경우인 모르겠음choices 배열의 가장 중간인 4점에 위치하며, 어떤 성격 유형의 점수에도 영향을 미치지 않으므로 점수를 나누는 기준이 된다.

따라서, 이 점수를 기준으로 하여, 각 문항의 답변에 따라 성격 유형의 점수를 계산한다.

  1. 모든 성격 유형의 점수가 나왔다면, 지표 순서에 따라 특정 유형인 TCJA, TFJA 등을 만들어야 한다.

앞서 정의한 8가지의 성격 유형은 2개씩 4가지의 지표로 나뉘므로, 이를 위한 새 배열을 만든다. => ['RT', 'CF', 'JM', 'AN']

1번에서 만든 객체를 이용해, 지표를 담고 있는 배열에서 순서대로 각 지표에서 더 큰 값. 즉, 더 큰 점수를 갖는 성격 유형을 리턴하도록 한다.

  1. 각 지표에 해당하는 2개의 성격 유형이 동일한 점수를 얻은 경우, 사전 순서에서 앞선 유형으로 해야 한다.

여기서는 지표 배열의 첫번째 성격 유형이 항상 2번째 성격 유형보다 사전 순서에서 앞서 있으므로 항상 첫번째 성격 유형을 리턴하도록 하면 된다.

0개의 댓글