[프로그래머스] 성격 유형 검사하기 (2022 KAKAO TECH INTERNSHIP)

2022. 12. 29. 16:59기록/Programmers

    목차

문제 링크

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

 

프로그래머스

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

programmers.co.kr


나의 문제 풀이

function solution(survey, choices) {
  let answer = '';
  const types = ['RT', 'CF', 'JM', 'AN'];
  const score = { R: 0, T: 0, C: 0, F: 0, J: 0, M: 0, A: 0, N: 0 };

  choices.forEach((choice, idx) => {
    const [disagree, agree] = survey[idx];
    score[choice > 4 ? agree : disagree] += Math.abs(choice - 4);
  });

  types.forEach((type) => {
    const [first, second] = type;
    answer += score[first] < score[second] ? second : first;
  });

  return answer;
}
  • 성격유형 타입들을 미리 배열에 넣어놓음
    • 각 요소의 문자는 사전 상 빠른 순으로 들어 있음
  • 각 성격유형과 점수 0을 가진 객체를 미리 만들어놓음
  • survey와 choices의 길이는 같음
    • survey에서 choices의 인덱스로 값을 찾음
      • ex) 'RT'
    • 구조 분해 할당으로 비동의, 동의 변수 값을 초기화함
      • ex) [disagree, agree] = 'RT'
      • disagree === 'R'
      • agree === 'T'
    • 선택한 문항이 4보다 클 경우 동의 문항, 작을 경우 비동의 문항
      • 문항 - 4 를 절대값으로 변환한 값을 누적함 (해당 문항의 점수)
      • 선택학 문항이 4일 경우 Math.abs(4 - 4) 로 0이 되기 때문에 상관없음
    • 성격유형 타입들을 하나씩 꺼냄
      • 구조 분해 할당으로 첫번째, 두번째 변수 값을 초기화함
      • 두번째 값이 더 클 경우 두번째 key를 정답 변수에 누적
      • 첫번째 값이 더 클 경우 첫번째 key를 정답 변수에 누적
      • 두 값이 같을 경우 첫번째 key를 정답 변수에 누적
        • type 문자열의 각 문자는 사전 상 빠른 순으로 들어있음
        • 항상 첫번째 변수가 사전 상 더 빠른 순서임

다른 사람의 문제 풀이

function solution(survey, choices) {
    const MBTI = {};
    const types = ["RT","CF","JM","AN"];

    types.forEach((type) =>
        type.split('').forEach((char) => MBTI[char] = 0);
    )

    choices.forEach((choice, index) => {
        const [disagree, agree] = survey[index];
        MBTI[choice > 4 ? agree : disagree] += Math.abs(choice - 4);
    });

    return types.map(([a, b]) => MBTI[b] > MBTI[a] ? b : a).join("");
}
function solution(survey, choices) {
    const data = { R: 0, T: 0, C: 0, F: 0, J: 0, M: 0, A: 0, N: 0 };

    for (let i = 0; i < survey.length; i++) {
        const score = choices[i] - 4;
        let type = survey[i].split('')[score < 0 ? 0 : 1] ;
        data[type] += Math.abs(score);
    }

    const { R, T, C, F, J, M, A, N } = data;
    return `${R >= T ? 'R' : 'T'}${C >= F ? 'C' : 'F'}${J >= M ? 'J' : 'M'}${A >= N ? 'A' : 'N'}`;
}