본문 바로가기
알고리즘

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

by 맨날개발 2023. 3. 10.

문제 요약

성격 유형 검사는 4개의 지표로 성격 유형을 구분합니다. 각 지표는 두개의 유형 중 하나로 결정됩니다. 검사지에는 n개의 질문이 있고 질문에는 7개의 선택지가 존재합니다.

질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 질문에 대한 선택지를 담은 1차원 배열 choices가 주어집니다.

  • survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.

아래는 선택지에 따른 점수를 결정하는 방법입니다.

chices
1 질문의 첫번째 유형의 점수 + 3
2 질문의 첫번째 유형의 점수 + 2
3 질문의 첫번째 유형의 점수 + 1
4 X
5 질문의 두번째 유형의 점수 + 1
6 질문의 두번째 유형의 점수 + 2
7 질문의 두번째 유형의 점수 + 3
  • RT 질문에 대한 1을 선택 한 경우 R 유형에 +3을 합니다.
  • NA 질문에 대한 6을 선택 한 경우 A 유형에 +2을 합니다.

최종적으로 지표마다 점수가 높은 유형으로 성격검사 결과를 반환합니다. 이때 점수가 동일한 경우 사전적으로 앞서는 유형을 반환합니다.

 

나의 생각

각 유형별로 점수를 정해야 하기때문에 해시로 구현하기로 결정하였습니다. 반복문을 통해 선택지에 따른 유형별로 점수를 객체에 저장합니다. 그리고 각 지표별로 점수를 비교하여 높은 유형을 반환합니다. 이때 동일한 점수인 경우를 조건문으로 추가하지 않기 위해서 사전적으로 앞서는 캐릭터를 앞에 배치한 배열을 반복문으로 처리하였습니다.

function solution(survey, choices) {
    const score = [0, 3, 2, 1, 0, 1, 2, 3]
    const result = {};
    
    survey.forEach((v, i) => {
        const [a, b] = v;
        const choice = choices[i];
        
        if (choice > 4) {
            result[b] = (result[b] || 0) + score[choice]; 
        } else if (choice < 4) {
            result[a] = (result[a] || 0) + score[choice];
        }
    });

    return ['RT', 'CF', 'JM', 'AN'].map((v) => {
        const [a, b] = v;
        const aScore = result[a] || 0;
        const bScore = result[b] || 0;
        
        if (aScore > bScore || aScore === bScore) {
            return a;
        } else {
            return b;
        }
    }).join('');
}

'알고리즘' 카테고리의 다른 글

[프로그래머스] 피보나치 수  (0) 2023.03.16
[프로그래머스] 가장 큰 수  (0) 2023.03.14
[프로그래머스] 실패율  (0) 2023.03.13
[프로그래머스] 양궁 대회  (0) 2023.03.10
[프로그래머스] 시저 암호  (0) 2023.03.09