개발일지

프로그래머스 - 성격 유형 검사하기 (Javascript) 본문

개발일지/알고리즘

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

Seobe95 2022. 8. 31. 00:57
 

프로그래머스

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

programmers.co.kr

성격유형 검사하기

접근방법

1. 모든 성격 유형에 0점을 매기고 시작하기

2. survey에 들어있는 2개의 성격 유형을 한 개로 나누기

3. 각 유형에 맞게 점수 매기기

4. 지표 번호 순으로 성격 나열하기

구현

function solution(survey, choices) {
  let answer = [];
  // 각 성격마다 점수를 추가할 수 있도록 Map 사용
  const kbti = new Map();
  // 문항 선택에 따른 점수 구분 -> 배열의 첫 요소로 0을 넣은 이유는 문항에는 0번 문항이 없기 때문
  const scoreList = [0, 3, 2, 1, 0, 1, 2, 3];
  // 각 성격 유형당 0점을 매기고 시작
  ["R", "T", "C", "F", "J", "M", "A", "N"].forEach((item) => {
    kbti.set(item, {
      score: 0,
    });
  });
  // 2개씩 붙어있는 성격 유형을 하나씩 구분하고, 각 유형에 선택 문항 점수를 추가해주기
  survey.forEach((item, index) => {
    const character = item.split("");
    const score = choices[index];
    // 선택 문항이 4 이하인 경우 첫번째 성격 유형에 점수 추가
    // 선택 문항이 4인 경우는 0을 더하므로 상관 X
    choices[index] <= 4
      ? kbti.set(character[0], {
          score: kbti.get(character[0]).score + scoreList[score],
        })
      // 선택 문항이 4 초과인 경우 첫번째 성격 유형에 점수 추가  
      : kbti.set(character[1], {
          score: kbti.get(character[1]).score + scoreList[score],
        });
  });

  // Map에 저장되어 있는 것들을 배열화하고, 같은 지표에 있는 성격끼리 점수를 비교하여 answer 배열에 추가
  // 같은 경우 먼저 오는 성격을 추가하는데, 8번 라인의 코드에서 순서를 지정했음
  for (let i = 0; i < kbti.size; i += 2) {
    [...kbti][i][1].score >= [...kbti][i + 1][1].score
      ? answer.push([...kbti][i][0])
      : answer.push([...kbti][i + 1][0]);
  }
  // 배열의 요소들을 한줄의 string으로 나열
  return answer.join("");
}