본문 바로가기
알고리즘

[프로그래머스] Lv 1. 성격 유형 검사하기 - Javascript 풀이

by daami 2025. 1. 8.

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/118666

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

핵심 정리

1. 구해야하는 것 : 검사자의 성격 유형 검사 결과 (지표 번호 순서 순)

2. 입력 - survey : survey 배열의 각 원소는 성격 유형 쌍이다. (e.g., "RT" or "TR")

3. 입력 - choices : choices 배열의 각 원소는 검사자가 선택한 질문의 선택지이다. 동의하는 정도가 1~7까지의 범위로 나누어져있다. 

  • 1~3 은 비동의를 나타낸다. 이는 성격 유형 쌍에서 전자가 해당한다.
  • 4는 중립
  • 5~7은 동의를 나타낸다. 이는 성격 유형 쌍에서 후자가 해당한다.

4. 필요한 것: 성격 유형 배열 =>  검사 결과 점수를 저장할 배열이다.

 

풀이

function solution(survey, choices) {
    const score = [3,2,1,0,1,2,3];
    const types = {R:0, T:0, C:0, F:0, J:0, M:0, A:0, N:0}; 

    //검사 결과 저장
    survey.forEach((item, idx) => {
        const [first, second] = item;
        const choice = choices[idx]; //해당 선택지

        if(choice < 4){
            types[first] += score[choice-1];
        } else if (choice > 4) {
            types[second] += score[choice-1];
        }
    });

    //지표 별 점수 비교
    const answer = [
    types.R >= types.T ? 'R' : 'T',
    types.C >= types.F ? 'C' : 'F',
    types.J >= types.M ? 'J' : 'M',
    types.A >= types.N ? 'A' : 'N'
];
    return answer.join('');
}

 

회고

- 처음에는 성격 유형 배열을 2차원 배열로 구성하려 해서 생각이 꼬였었다. 각 지표 당 비교해야하니까 지표 별로 배열을 또 만들었기 때문이다. 굳이 잘게 나눠서 배열에 담을 필요가 없었는데.. 자료 구조를 단순하게 구성하고, 계산에서 복잡한 부분을 해결할 수 있게 해야겠다.

 

- 또 지표 별 결과를 계산하는 부분에서 types[R] 이런 식으로 표기했었는데, 실행 오류로 ReferenceError: R is not defined가 발생했다. R이 변수로 선언되지 않았기 때문이였다.

이러한 '대괄호 표기법'은 속성 이름이 동적으로 결정하거나, 변수에 기반에 접근해야하는 경우에만 사용할 수 있다.

types[first] += score[choice - 1];

이렇게 쓸 수 있었던 이유는 first가 위에서 변수로 선언되었고, 값이 동적으로 결정되기 때문이다. 

 

반면 '점 표기법'은 정적 속성을 접근할 때 사용한다. 

따라서 이 부분은 점 표기법을 사용해야한다.

 

그동안 점 표기법과 대괄호 표기법을 아무때나 쓰고 있었는데 이번에 정리할 수 있었다.☺️

 

- 카카오에서 냈던 코딩테스트 문제들을 쭉 풀어보고 있는데, 구조 분해 할당을 이용하는 부분이 많은 것 같다.

- forEach에서 index를 쓰면 해당 인덱스를 쉽게 가져올 수 있다.

- Array 인스턴스의 join() 메서드는 새 문자열을 반환한다.