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

이민선(Jasmine)·2023년 1월 20일
0
post-thumbnail

나의 코드

function solution(survey, choices) {
 let type = "";
 let score = {
     R:0,
     T:0,
     C:0,
     F:0,
     J:0,
     M:0,
     A:0,
     N:0, 
 };

  survey.forEach((v,i)=> {
      let neg = v[0];
      let pos = v[1];
      choices[i] - 4 < 0 ? score[neg] += (4-choices[i]) : score[pos] += choices[i]-4
  })
   type = score.R >= score.T? type + "R" : type + "T";
   type = score.C >= score.F? type + "C" : type + "F";
   type = score.J >= score.M? type + "J" : type + "M";
   type = score.A >= score.N? type + "A" : type + "N";
    return type;
}

각 유형의 점수를 나타낼 수 있는 score 객체를 생성.
survey를 forEach로 순회하면서 survey의 첫 글자는 neg(부정) 변수에 저장
두번째 글자는 pos(긍정) 변수에 저장.
choices의 i번째 결과가 4보다 작으면 score객체에서 neg 변수의 값을 점수만큼 증가.
4보다 크면 pos 변수의 값을 점수만큼 증가.
=> 객체에서 각 유형의 점수가 나타나게 됨.
맨 처음에 빈 문자로 지정한 type이라는 변수에 1글자 씩 추가.
R의 점수와 T의 점수를 비교하여 더 큰 타입을 빈 문자열에 더해줌.
여기서 >가 아닌 >=를 써야 하는 이유는
R과 T의 점수가 같다면 알파벳 순서에서 먼저 오는 R을 더해줘야 하기 때문.
CF, JM, AN도 같은 논리로 진행.

생각보다 어렵지 않게 통과는 했지만, 반복되는 작업이 많아 다소 비효율적인 코드 같다.
그래서 1점 밖에 못 받은건가....?
만약 저 코드를 MBTI 성격 유형으로 변환한다고 가정하면? 저 코드에 흩어져 있는 알파벳을 일일히 다 바꿔줘야 한다.

그렇게 보게된 코드

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

        MBTI[choice > 4 ? agree : disagree] += Math.abs(choice - 4);
    });

    return types.map(([a, b]) => MBTI[b] > MBTI[a] ? b : a).join("");
}

이 코드가 마음에 들었던 점 :
1. 성격 유형 알파벳이 코드 통틀어 한 줄만 들어감. 10초만에 진짜 MBTI 검사 결과("RT" 지우고 "IE"로 수정, "CF" 지우고 "NS"로 수정..)로 바꿀 수 있다.
나는 score 객체를 생성할 때 R:0, T:0, ... N:0 일일히 수작업을 해주었지만,
이 코드에서는 forEach를 사용하여 빈 객체(MBTI)에 각 유형의 value를 0으로 넣어달라고 컴퓨터한테 명령한다.

  1. (잠시 생각만 하고 정신 없어 못 사용했던) 구조분해 할당으로 부정 타입과 긍정 타입 지정.

  2. MBTI 객체의 key 자체에서 3항 연산자 사용.

MBTI[choice > 4 ? agree : disagree] += Math.abs(choice - 4);

key 자체에서 3항 연산자를 사용하니 내 코드보다 더 간단하다. 나는 score를 2번 써줬지만, 위의 코드에서는 MBTI를 한 번만 써주면된다.

 choices[i] - 4 < 0 ? score[neg] += (4-choices[i]) : score[pos] += choices[i]-4

귀찮은 작업을 최대한 피할 수 있는 코드인지 고민하는 것도 중요하다는 생각이 들었다.

profile
기록에 진심인 개발자 🌿

0개의 댓글