문제
https://school.programmers.co.kr/learn/courses/30/lessons/118666
- 검사지에 총 N개의 질문, 각 질문마다 7개의 선택지 존재함
- 각 지표별 점수를 계산해서 성격 유형을 출력하는 문제
풀이(정답)
function solution(survey, choices) {
let answer = '';
// 4개의 지표를 연관되는 순으로 객체 쌍으로 만들었다.
const indicators = {
1: {R: 0, T: 0},
2: {C: 0, F: 0},
3: {J: 0, M: 0},
4: {A: 0, N: 0},
};
for (let i = 0; i < survey.length; i++) {
// 선택 결과를 반복하며 두 가지 선택지를 분리한다.
const [lower, higher] = survey[i].split('');
let n = 0;
// 현재 문자열에 포함된 문자를 정규표현식으로 확인하여 indicators 객체의 키값을 추출
if (survey[i].match(/R/g)) n = 1;
if (survey[i].match(/C/g)) n = 2;
if (survey[i].match(/J/g)) n = 3;
if (survey[i].match(/A/g)) n = 4;
// lower +1
if (choices[i] < 4) {
indicators[n][lower] += Math.abs(choices[i] - 4);
}
// higher +1
else if (choices[i] > 4) {
indicators[n][higher] += Math.abs(choices[i] - 4);
} else {
}
}
// 카운트가 더해진 indicator 객체를 돌며 정답을 구한다.
for (let indicator of Object.values(indicators)) {
const key = Object.keys(indicator);
const [lower, higher] = key;
if (indicator[lower] >= indicator[higher]) answer += lower;
else answer += higher;
}
return answer;
}
- 4개의 지표에 각각 두 가지 문자열을 포함하고 있으므로 4개씩 짝지어 객체를 만들었다.
다른 풀이
function ref(survey, choices) {
const MBTI = {};
const types = ['RT', 'CF', 'JM', 'AN'];
// forEach문을 활용해 각 지표와 점수를 계산하는 해시맵 생성
types.forEach(type => type.split('').forEach(char => (MBTI[char] = 0)));
choices.forEach((choice, index) => {
// 동의, 비동의 지표를 구조분해할당
const [disagree, agree] = survey[index];
// 점수가 4이상 인지 확인하여 해당하는 문자열로 접근하여 절댓값을 합산
MBTI[choice > 4 ? agree : disagree] += Math.abs(choice - 4);
});
// 4지표를 짝지어둔 types 배열을 돌며 크기를 비교하여 정답을 구한다.
return types.map(([a, b]) => (MBTI[b] > MBTI[a] ? b : a)).join('');
}
- 2개의 문자열이 짝지어져 있는 부분이 애매했는데, 배열과 구조분해할당, 삼항 연산자를 적절히 활용해 훨씬 간편하게 푼 것 같다. map을 돌면서 해당 요소를 구조분해할당 할 수 있을거라고는 생각을 못했는데 새로운 접근.
'Algorithm & 자료구조 > 알고리즘 w.JavaScript' 카테고리의 다른 글
[알고리즘 JS] 신고 결과 받기 (프로그래머스 Lv.1) (0) | 2023.01.17 |
---|---|
[알고리즘 JS] 햄버거 만들기 (프로그래머스 Lv.1) (3) | 2023.01.16 |
[알고리즘 JS] 숫자 짝꿍 (프로그래머스 Lv.1) (1) | 2023.01.02 |
[알고리즘 JS] 로또의 최고 순위와 최저 순위 (프로그래머스 Lv.1) (0) | 2022.11.16 |
[알고리즘 JS] 다트 게임 (프로그래머스 Lv.1) (0) | 2022.11.15 |