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

박기영·2022년 9월 18일
0

프로그래머스

목록 보기
56/126

solution

function solution(survey, choices) {
    // choices에 의한 점수 결과를 기록하기 위한 객체
    let test = {
        R: 0,
        T: 0,
        C: 0,
        F: 0,
        J: 0,
        M: 0,
        A: 0,
        N: 0,
    };
    
    // 최종 성향을 출력하기 위한 변수
    let ans = "";
    
    // survey와 choices 배열의 길이가 같고
    // survey[i]의 질문에 대한 결과는 choices[i]에 들어있다.
    for(let i = 0; i < survey.length; i++){
        // 비동의 ~ 동의 순서
        let [no, yes] = survey[i].split("");
        
        // survey[i]에 대한 유저의 선택값
        let grade = choices[i]
        
        if(grade === 4){
            // "모르겠음"에 체크하면 그 어떤 성향도 점수를 받지않는다.
            continue;
        } else if(grade < 4){
            // 만약 유저가 1~3의 값을 선택했다면
            // no에 해당하는 성향이 선택한 값만큼의 점수를 얻는다.
            // 여기서 주의할 점은
            // 1은 3점, 2는 2점, 3은 1점이라는 것이다.
            test[no] += (4 - grade);
        } else if(grade > 4){
            // 만약 유저가 5~7의 값을 선택했다면
            // yes에 해당하는 성향이 선택한 값만큼의 점수를 얻는다.
            // 여기서 주의할 점은
            // 5는 1점, 6은 2점, 7은 3점이라는 것이다.
            test[yes] += (grade - 4);
        }
    }
    
    if(test["R"] > test["T"]){
        ans += "R";
    } else if(test["R"] < test["T"]){
        ans += "T";
    } else {
        ans += ["R","T"].sort()[0];
    }
    
    if(test["C"] > test["F"]){
        ans += "C";
    } else if(test["C"] < test["F"]){
        ans += "F";
    } else {
        ans += ["C","F"].sort()[0];
    }
    
    if(test["J"] > test["M"]){
        ans += "J";
    } else if(test["J"] < test["M"]){
        ans += "M";
    } else {
        ans += ["J","M"].sort()[0];
    }
    
    if(test["A"] > test["N"]){
        ans += "A";
    } else if(test["A"] < test["N"]){
        ans += "N";
    } else {
        ans += ["A","N"].sort()[0];
    }
    
    return ans;
}

객체를 사용한 것은 좋았으나,
마지막에, 점수에 따른 성향 선택 부분에서 if문을 남발해서
코드가 깨끗해보이지는 않는다.
최대 1000개까지의 데이터가 들어올 경우 for문에서 test 객체의 값들을 조정한 뒤,
객체의 key 값들로만 비교를 하기 때문에
시간 초과 문제는 없었다.

if문 부분을 줄일 수 있는 방법이 없을까?

다른 분 풀이

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];

        // chice의 값에 따라 성향을 나눠, 위에서 만든 MBTI 객체의 key값에 넣어준다
        // 점수 환산 로직에 맞춰서 산술한 값을 누적합 한다.
        MBTI[choice > 4 ? agree : disagree] += Math.abs(choice - 4);
    });

    // map에서도 이런 방식으로 하나의 문자열을 a, b로 나눌 수 있구나..!
    return types.map(([a, b]) => MBTI[b] > MBTI[a] ? b : a).join("");
}

이런 방식으로도 if문을 줄일 수 있다.
필자의 접근 방법으로는 if문을 사용하는게 맞아보인다.

만약 성향이 사전 순서로 나온게 아니라 뒤죽박죽 섞여있었다면
sort()로 반드시 처리를 해야할 것이다.
MBTI 객체를 만들 때 type.split(" ").sort().forEach() 로 바꿔주면 간단하게 처리 가능할 것 같다.

실험해본 결과 잘 통과가 된다.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글