성격 유형 검사

Sheryl Yun·2023년 7월 21일
0

문제 링크

처음 풀이

  • 주어진 것이 많아서 고민했는데 이미 고정된 것(personality, survey, choices)과 변동성 있는 것(personality 각각의 점수)을 구분했더니 문제가 풀렸다.
  • 풀고 나니 2점이 떠서 if-elseif 문을 정리해봤지만 이 문제가 아닌 것 같았다 ^^
function solution(survey, choices) {
    let answer = '';
    let personality = { 'R': 0, 'T': 0, 'C': 0, 'F': 0, 'J': 0, 'M': 0, 'A': 0, 'N': 0 };
    
    for (let i = 0; i < survey.length; i++) {
        if (choices[i] < 4) personality[survey[i][0]] += 4 - choices[i];
        if (choices[i] > 4) personality[survey[i][1]] += choices[i] - 4;
    }

    let keys = Object.keys(personality);
    
    for (let i = 0; i < keys.length - 1; i++) {
        if (personality[keys[i]] >= personality[keys[i + 1]]) answer += keys[i];
        else answer += keys[i + 1];
        
        i++; // i를 2만큼 뒤로 이동
    }
    
    return answer;
}

새로운 풀이

  • 다른 사람 코드에서 크게 4가지 get
    • 성격 객체를 하드 코딩하지 않고 types.forEach를 통해 생성
    • 문자열을 자바스크립트 배열 destructuring로 분리 (처음 알게 됨)
    • choice와 인덱스의 차이를 절대값(Math.abs)으로 구함 (천재만재)
    • 전체적으로 고차 함수(forEach, map)를 사용해서 코드가 깔끔
function solution(survey, choices) {
    let MBTI = {};
    let types = ['RT', 'CF', 'JM', 'AN'];
    
    // 성격 객체 생성
    types.forEach((type) => {
        [...type].forEach((t) => MBTI[t] = 0); // value까지 같이 부여해야 만들어짐
    });
    
    choices.forEach((choice, i) => {
        const [disagree, agree] = survey[i]; // 문자열을 배열 디스트럭쳐링으로 분리

        // choice <= 4 ? MBTI[disagree] += Math.abs(choice - 4) : MBTI[agree] += Math.abs(choice - 4); 
        MBTI[choice <= 4 ? disagree : agree] += Math.abs(choice - 4); // 위 라인 리팩토링
    });
    
    // map으로 꺼낼 때 배열 디스트럭쳐링 사용
    return types.map(([a, b]) => MBTI[a] < MBTI[b] ? b : a).join('');
}

split 메서드를 줄이기 위해 [...type]으로 변경했다. (다시 이해하면서 푸는 과정에서 리팩토링 흔적이..)
배울 게 많은 코드였다 👍

profile
영어강사, 프론트엔드 개발자를 거쳐 데이터 분석가를 준비하고 있습니다 ─ 데이터분석 블로그: https://cherylog.tistory.com/

0개의 댓글