[알고리즘]-성격 유형 검사하기

dev_woo·2025년 1월 1일
post-thumbnail

요약

풀이 시간 : 19분 27초

1. 직관적인 변수명 사용하기
2. Math.abs() 절대값을 통해 값 계산하는 유형 파악
  -> 이외에도 count ++ -- 로 균형을 이루는 계산도 있음
3. flatMap() 메서드의 활용
4. 구조분해할당의 활용
5. 배열을 활용한  Object, Map, Set 객체 선언

문제 링크

성격 유형 검사하기

풀이

function solution(survey, choices) {
    const arr = [
        "R","T",
        "C","F",
        "J","M",
        "A","N",
    ]; // 성격 지표
    const scores = new Map(arr.map(key => [key, 0])); // 성격 지표 점수
    const points = ["", 3, 2, 1, 0, 1, 2, 3]; // 점수 환산
    
    for(const [i, pair] of survey.entries()){
        const choice = choices[i]; // 선택지
        const point = points[choice]; // 반영 점수
        const [key1, key2] = pair; // key값 반영
        if(choice < 4){ // 점수 반영하기
            scores.set(key1, scores.get(key1) + point);
        }else if(choice > 4 ){
            scores.set(key2, scores.get(key2) + point);
        }
    }
    
    let result = "";
    result += scores.get("R") >= scores.get("T") ? "R" : "T";
    result += scores.get("C") >= scores.get("F") ? "C" : "F";
    result += scores.get("J") >= scores.get("M") ? "J" : "M";
    result += scores.get("A") >= scores.get("N") ? "A" : "N";
    return result;
}

성격 유형별 점수를 계산하고, 최종적으로 더 높은 점수를 가진 항목을 선택하여, 성격유형을 선택하는 문제입니다. 성격 지표 점수를 반영할 Map 객체를 만들고, survey 를 순회하면서, 선택한 점수를 반영하고, 최종적으로 선택된 결과를 반환하는 문제입니다.

풀이 개선

function solution(survey, choices) {
    const MBTIs = ["RT","CF","JM","AN"]; // MBTI 유형들
    const scores = new Map(MBTIs.flatMap(([key1, key2]) => [[key1, 0], [key2, 0]])); // 점수 반영
    
    for(const [i, MBTI] of survey.entries()){ // 검사 반영
        const choice = choices[i]; // 검사결과
        const [key1, key2] = MBTI; 
        if(choice < 4) {
            scores.set(key1, scores.get(key1) + Math.abs(choice - 4));
        }else if(choice > 4){
            scores.set(key2, scores.get(key2) + Math.abs(choice - 4));
        }
    }
    
    return MBTIs
    .map(([key1, key2]) => scores.get(key1) >= scores.get(key2) ? key1 : key2)
    .join("");
}

변수명을 더 직관적인 이름인 MBTI로 변경하여 코드의 가독성을 높였으며, 중복 코드를 map 메서드를 활용해 제거했습니다. 또한, 점수 계산은 Math.abs()를 사용하여 간단하고 직관적으로 개선했습니다.

profile
꾸준히 한걸음씩

0개의 댓글