일기

(JavaScript) 성격 유형 검사하기

Realuda72 2024. 12. 16. 10:18

choices의 값에 따라 switch문을 돌린다.

해당 유형의 점수를 저장하는 객체 result에 반영한다.

result객체에서 성격 유형별 점수를 비교해 answer를 만든다.

function solution(survey, choices) {
    var answer = '';
    var result = {};
    for (i = 0; i < choices.length; i++) {
        switch (choices[i]) {
            case 1:
                var e = survey[i][0];
                if (result[e]) result[e] += 3;
                else result[e] = 3;
                break;
            case 2:
                var e = survey[i][0];
                if (result[e]) result[e] += 2;
                else result[e] = 2;
                break;
            case 3:
                var e = survey[i][0];
                if (result[e]) result[e] += 1;
                else result[e] = 1;
                break;
            case 4:
                break;
            case 5:
                var e = survey[i][1];
                if (result[e]) result[e] += 1;
                else result[e] = 1;
                break;
            case 6:
                var e = survey[i][1];
                if (result[e]) result[e] += 2;
                else result[e] = 2;
                break;
            case 7:
                var e = survey[i][1];
                if (result[e]) result[e] += 3;
                else result[e] = 3;
                break;
            default:
                break;
        }
    }
    result['R'] < result['T'] ? answer += 'T' : answer += 'R';
    result['C'] < result['F'] ? answer += 'F' : answer += 'C';
    result['J'] < result['M'] ? answer += 'M' : answer += 'J';
    result['A'] < result['N'] ? answer += 'N' : answer += 'A';
    return answer;
}

=> 한번도 선택되지 않은 성격 유형의 경우 점수가 undefined로 나오게 되는데, undefined에 비교 연산을 수행하면 항상 false가 나온다고 한다. 이것 때문에 계속 틀렸다.

function solution(survey, choices) {
    var answer = '';
    var result = {'R':0, 'T':0, 'C':0, 'F':0, 'J':0, 'M':0, 'A':0, 'N':0};
    for (i = 0; i < choices.length; i++) {
        switch (choices[i]) {
            case 1:
                var e = survey[i][0];
                result[e] += 3;
                break;
            case 2:
                var e = survey[i][0];
                result[e] += 2;
                break;
            case 3:
                var e = survey[i][0];
                result[e] += 1;
                break;
            case 4:
                break;
            case 5:
                var e = survey[i][1];
                result[e] += 1;
                break;
            case 6:
                var e = survey[i][1];
                result[e] += 2;
                break;
            case 7:
                var e = survey[i][1];
                result[e] += 3;
                break;
            default:
                break;
        }
    }
    // undefined 는 NAN으로 변환 후 연산하기 때문에 항상 false를 반환한다
    result['R'] < result['T'] ? answer += 'T' : answer += 'R';
    result['C'] < result['F'] ? answer += 'F' : answer += 'C';
    result['J'] < result['M'] ? answer += 'M' : answer += 'J';
    result['A'] < result['N'] ? answer += 'N' : answer += 'A';
    return answer;
}

=> 유형 점수가 undefined가 나오지 않도록 초기 값을 0으로 초기화한다.

초기값이 모두 0이므로 switch문 안에서 점수가 있는지 확인하는 구문을 제거했다.

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

    // MBTI 객체 초기화
    types.forEach((type) =>
        type.split('').forEach((char) => MBTI[char] = 0)
    )

    choices.forEach((choice, index) => {
        // 구조분해 할당을 통해 disagree와 agree를 초기화
        const [disagree, agree] = survey[index];

        // 선택이 4 이상이면 동의, 아니면 비동의 유형에 점수를 추가한다
        MBTI[choice > 4 ? agree : disagree] += Math.abs(choice - 4);
    });

    // map 메서드를 통해 일괄적으로 처리
    return types.map(([a, b]) => MBTI[b] > MBTI[a] ? b : a).join("");
}

=> 다른사람의 풀이이다. 주석은 내가 임의로 달았다.

구조분해할당, map함수 등 js의 기능을 적극적으로 사용한 부분이 인상깊다.

'일기' 카테고리의 다른 글

(JavaScript) 바탕화면 정리  (0) 2024.12.18
라우팅  (0) 2024.12.16
Classless Inter Domain Routing(CIDR)  (0) 2024.12.15
Classful IP Addressing  (0) 2024.12.14
IP주소  (0) 2024.12.14