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

이명진·2023년 2월 23일
0

코드카타

목록 보기
60/69

문제 요약

MBTI 를 카카오 유형으로 변경한 문제이다. 카카오 코테문제 이고 레벨 1문제이다.
각 유형별로 네오, 어피치, 무지, 라이언 등의 이름으로 되어 있다.
비교 유형 군 값과 선택한 번호 가 주어진다. 번호는 긍정,부정으로 나뉘어져 있으며
긍정일경우 비교유형군 첫번째 값이 3,2,1점 으로 많아지고 부정일경우 비교 유형군의 두번째 값이 1,2,3 형식으로 점수가 매겨진다.

각 점수들을 구하고 큰 값으로 비교하여 리턴하면 된다. 하지만 동률일경우 사전순으로 리턴한다.

내가 푼풀이

약간 쉽게 봤었는데 어렵게 생각해서 시간이 좀 걸렸던 문제였다.
객체안에 객체 형태로 값을 넣어놔서 값을 넣고 빼는데 시간이 많이 소요되었고 빼내기 어려운 점도 있었다.

내가 푼 풀이의 코드

function solution(survey, choices) {
    var answer = '';
    const upScore = [3,2,1];
    const downScore=[1,2,3];
    let surveyObj= {'RT':{'R':0,'T':0},'CF':{'C':0,'F':0},'JM':{'J':0,'M':0},'AN':{'A':0,'N':0}}

    survey.map((x,i)=>{
      const [name1,name2]=x.split('');

      const choice = choices[i];

      if(choice<4){
         let copyX = x.split('').sort().join('');

        for(let key in surveyObj[copyX]){
           if(key===name1){

             surveyObj[copyX][name1]+=upScore[choice-1]
           }
        }

      }
      else if(choice>4){

         let copyX = x.split('').sort().join('');
           for(let key in surveyObj[copyX]){
           if(key===name2){

           surveyObj[copyX][name2]+=downScore[choice-5]
           }
        }

      }

    })

   let objVal = Object.values(surveyObj)
  for(let j in objVal){
    let obj = Object.entries(objVal[j]);
    let [a,b] = obj

    if(a[1]>=b[1]){
      answer+=a[0]
    }else if(a[1]<b[1]){
      answer+=b[0]
    }
  }

    return answer;
}

길게 문제를 풀었다. 위에서 언급한 대로 객체안에 객체로 값을 관리해서 값을 빼기도 넣기도 힘들었다.

그래도 배운점이 있다면
Object.values(surveyObj)와 Object.entries(objVal[j])에 대해서 다시 한번 상기시킬수 있었다

Object.values

객체의 값들만 빼서 배열로 정리한다.

사용 : Object.values(객체이름)
// 결과 : [값,값,값];

Object.entries

객체를 키와 값을 배열로 정리한다.

사용 : Object.entries(객체이름)
//결과 [[키,값],[키,값]]

다른사람의 풀이

나머지 분들은 객체 한겺으로 유형을 관리하여서 코드가 짧았다. 그중에서도 배울점이 있는 코드를 가져왔다.

function solution(survey, choices) {
    var answer = '';
    let indi = new Map();
    ['R','T', 'C','F', 'J','M', 'A', 'N'].forEach(item => indi.set(item, 0));

    choices.forEach((item,index) => {
        let [A, B] = survey[index].split('');
        if(item > 4) indi.set(B, indi.get(B)+item-4);
        else if(item < 4) indi.set(A, indi.get(A)+4-item);
    })
    answer += indi.get('R') >= indi.get('T') ? 'R' : 'T';
    answer += indi.get('C') >= indi.get('F') ? 'C' : 'F';
    answer += indi.get('J') >= indi.get('M') ? 'J' : 'M';
    answer += indi.get('A') >= indi.get('N') ? 'A' : 'N';
    return answer;
}

new Map() 에 대해서 배울수 있었다.

객체로 만들어 줄때 new Map() 자체로 만들어 주면 typeof 값으로 확인하였을때 객체 형태로 만들어진다.
값들도 이런 형식으로 도출되어서 한눈에 보기 쉬운것 같다.

new Map()

new Map 의 프로토 타입은 이렇다

get: ƒ get(),
set: ƒ set(),
has: ƒ has(),
delete: ƒ delete(),
clear: ƒ clear(),
entries: ƒ entries(),
forEach: ƒ forEach(),
keys: ƒ keys(),
size: 8,
values: ƒ values()

get()으로 new Map() 만들어진 객체에서 값들을 가져오고
set으로 설정이 가능하다.

그리고 삭제도 가능하고 키값들도 가져올수 있는것같다.
Obj의 프로토 타입이 이어져서 사용이 가능하다.

다음번에 객체로 관리할때 new Map() 형식으로 만들어서 문제를 풀어 봐야 겠다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글