코딩 테스트/프로그래머스(LV1)

[프로그래머스] 성격 유형 검사하기 (LV1 - JavaScript)

dev-hpk 2024. 10. 22. 12:30
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제

나만의 카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.

지표 번호 성격유형
1번 지표 라이언형(R), 튜브형(T)
2번 지표 콘형(C), 프로도형(F)
3번 지표 제이지형(J), 무지형(M)
4번 지표 어피치형(A), 네오형(N)

 

4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, "RFMN"이나 "TCMA"와 같은 성격 유형이 있습니다.

검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.

  • 매우 비동의
  • 비동의
  • 약간 비동의
  • 모르겠음
  • 약간 동의
  • 동의
  • 매우 동의

각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.

예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 있습니다.

 

선택지 성격 유형 점수
매우 비동의 네오형 3점
비동의 네오형 2점
약간 비동의 네오형 1점
모르겠음 어떤 성격 유형도 점수를 얻지 않습니다
약간 동의 어피치형 1점
동의 어피치형 2점
매우 동의 어피치형 3점

 

이때 검사자가 질문에서 약간 동의 선택지를 선택할 경우 어피치형(A) 성격 유형 1점을 받게 됩니다. 만약 검사자가 매우 비동의 선택지를 선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.

 

위 예시처럼 네오형이 비동의, 어피치형이 동의인 경우만 주어지지 않고, 질문에 따라 네오형이 동의, 어피치형이 비동의인 경우도 주어질 수 있습니다.

하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.

  • 매우 동의나 매우 비동의 선택지를 선택하면 3점을 얻습니다.
  • 동의나 비동의 선택지를 선택하면 2점을 얻습니다.
  • 약간 동의나 약간 비동의 선택지를 선택하면 1점을 얻습니다.
  • 모르겠음 선택지를 선택하면 점수를 얻지 않습니다.

검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.

 

질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ survey의 길이 ( = n) ≤ 1,000
    • survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나입니다.
    • survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
    • survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미합니다.
  • choices의 길이 = survey의 길이
    • choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미합니다.
    • 1 ≤ choices의 원소 ≤ 7

입출력 예

survey choices result
["AN", "CF", "MJ", "RT", "NA"] [5, 3, 2, 7, 5] "TCMA"
["TR", "RT", "TR"] [7, 1, 3] "RCJA"

 

2. 정답 풀이

풀이 전략

  • 제한 사항에서 첫 번째 캐릭터가 비동의 선택, 두 번째 캐릭터가 동의 선택인 점을 이용한다.
  • types라는 유형별 점수를 담을 object를 선언한다.
  • choice를 순회하며 각 선택에 대한 유형 점수를 합산한다.
  • types의 key 값이 오름차순 정렬이기 때문에 survey를 순회할 때도 오름차순으로 정렬 후 점수를 계산한다.
  • 4 - choice : survey가 오름차순 정렬인 경우이므로 비동의 선택인 경우 types[survey]의 value를 -한다.
  • choice - 4 : survey가 오름차순 정렬이 아닌 경우이므로 오름차순 하게 되면 첫 번째 캐릭터와 두 번째 캐릭터의 위치가 바뀌므로 연산을 반대로 해야 한다(+면 -, -면 +).
  • types를 순회하며 더 높은 점수를 받은 유형을 반환한다.
function solution(survey, choices) {
    let answer = ''
    const types = {
        "RT": 0,
        "CF": 0,
        "JM": 0,
        "AN": 0
    }
    choices.map((choice, i) => {
        const sorted = survey[i].split('').sort().join('')
        if(survey[i] === sorted) types[survey[i]] += 4 - choice
        else types[sorted] += choice - 4
    })
    for(let [key, value] of Object.entries(types)) {
        if(value >= 0) answer += key[0]
        else answer += key[1]
    }
    return answer
}

 

3. 다른 사람 풀이

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("");
}

 

const [disagree, agree] = survey[index];
MBTI[choice > 4 ? agree : disagree] += Math.abs(choice - 4);
구조 분해 할당으로 첫 번째 문자를 disagree, 두 번째 문자를 agree로 받는 접근 방법은 생각해본적도 없고, 몇번을 봐도 너무 간결하다...😱😱😱

 

 

 

처음 문제를 읽었을 때는 내용이 길고 복잡해서, 입력값인 survey의 각 요소마다 조건 분기를 처리해야 할 것 같아 막막했다. 하지만 입출력 예시의 점수 계산 테이블을 보고 나니, 유형별로 하나의 객체에 묶어 점수를 연산하는 방식으로 접근할 수 있겠다는 생각이 들었다.

 

느낀 점

  • 복잡해 보이는 문제도 구조를 잘 파악하면 단순화할 수 있다.
  • 문제를 풀기 전에 효율적인 방식으로 접근하는 연습을 습관화 해야겠다.
  • 다른 사람이 푼 풀이에서 더 나은 부분을 분석하고 내 것으로 만드는 연습을 해야겠다🔥🔥
 

 

 

 

[프로그래머스] 키패드 누르기 (LV1 - JavaScript)

프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 1. 문제스

dev-hpk.tistory.com

 

 

[프로그래머스] 크레인 인형뽑기 게임 (LV1 - JavaScript)

프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 1. 문제 

dev-hpk.tistory.com