문제 요약
성격 유형 검사는 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 |