우파루파의 개발 기록

[프로그래머스] 성격 유형 검사하기 본문

development/알고리즘

[프로그래머스] 성격 유형 검사하기

upa-r-upa 2022. 8. 21. 18:59

안녕하세요.

이번 문제는 프러그래머스 1단계 - 성격 유형 검사하기 입니다.

이 문제는 2022 카카오 테크 인턴쉽 문제라고 하는데, 최신 문제라서 그런지 아직은 Best practice가 존재하지 않는 것 같습니다.

알고리즘 문제 설명입니다. 상당히 깁니다. 일부만 발췌했습니다.

저같은 경우 이번 문제는.. 문제를 이해하는 것 자체가 오래 걸렸습니다. 오히려 푸는 건 금방 풀었던 것 같은데요. 이 부분이 아쉽습니다.

일단 정답 초안입니다.

function solution(survey, choices) {
    const data = [
        ["R", "T"],
        ["C", "F"],
        ["J", "M"],
        ["A", "N"]
    ];
    const calc = {
        "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 [before, after] = survey[i].split("");

        if (choices[i] < 4) calc[before] += 4 - choices[i];
        else if (choices[i] > 4) calc[after] += choices[i] - 4;
    }

    return data.map(([a, b]) => {
        if (calc[a] === calc[b]) return a < b ? a : b;
        else return calc[a] > calc[b] ? a : b;
    }).join("");
}

상당히 길다는 느낌이 들고.. 아쉬운 부분이 한두개씩 보입니다. 그래서 이후 개선할 수 있는 포인트를 찾아서 나름 개선해 보았습니다.

 

최종 답안입니다.

function solution(survey, choices) {
    const calc = {"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) calc[survey[i][0]] += Math.abs(4 - choices[i]);
        else if (choices[i] > 4) calc[survey[i][1]] += Math.abs(4 - choices[i]);
    }
    
    function getType(a, b) {
        if (calc[a] === calc[b]) return a < b ? a : b;
        else return calc[a] > calc[b] ? a : b;
    }   
    
    return getType("R", "T") + getType("C", "F") + getType("J", "M") + getType("A", "N")
}

calc 변수의 경우 Map과 Object의 사용을 고민했는데, 삭제가 이루어지지 않는 데이터일 뿐더러 적은 용량의 데이터이기에 일반 Object를 선택했습니다.

1단계이긴 하지만, 저에게 이번 문제는 상당히 까다로워서 즐거웠던 것 같습니다.

 

 

피드백은 언제나 환영이니 부탁드립니다.

감사합니다.