Algorithm & 자료구조/알고리즘 w.JavaScript

[알고리즘 JS] 성격 유형 검사하기 (프로그래머스 Lv.1)

프라이D 2023. 1. 15. 23:11

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 검사지에 총 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을 돌면서 해당 요소를 구조분해할당 할 수 있을거라고는 생각을 못했는데 새로운 접근.