Algorithm

프로그래머스.png

문제 설명

성격 유형 검사지를 만들려고 한다.다음과 같은 4개 지표로 성격 유형을 구분한다. 성격은 두 유형 중 하나.

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

유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있다.

질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어진다. 고로, choices의 길이와 survey의 길이는 같다.

survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나다. survey[i][0]은 질문의 비동의 선택지를 선택하면 받는 성격 유형을 의미한다. survey[i][1]은 질문의 동의 선택지를 선택하면 받는 성격 유형을 의미한다.

choices 에는 다음과 같은 7개의 선택지가 있고 각 숫자는 오른쪽 뜻을 의미한다.

choices
1 매우 비동의
2 비동의
3 약간 비동의
4 모르겠음
5 약간 동의
6 동의
7 매우 동의

choices 를 지표로 성격 유형 점수를 합산한 후, 각 지표에서 더 높은 점수를 받은 성격 유형을 산출한다. 단, 하나의 지표에서 성격 유형 점수가 같으면, 둘 중 사전 순으로 빠른 유형을 성격 유형으로 판단한다.

검사자의 성격 유형 검사 결과를 지표 번호 순서대로 리턴하도록 함수를 완성해라.

매개변수

  • survey : 질문마다 판단하는 지표를 담은 1차원 문자열 배열
    • "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나
  • choices : 각 질문마다 선택한 선택지를 담은 1차원 정수 배열
    • 1 ~ 7의 숫자

입출력 예

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

내 풀이

Map 객체를 사용하였다. 먼저, 각 유형 별 점수를 누적하여 key-value 로 저장하였다. 성격 유형이 4자리이고 각 자리마다 두 유형으로 나뉘는데, 이를 각 자리마다 알맞은 유형을 리턴하는 함수를 만드는게 쉬운 방법일 것 같았다.

유형 알파벳을 리턴하는 함수는 두 가지 유형의 알파벳을 받아, 먼저 사전 순으로 정렬한다. 그리고 Map 객체에서 key에 해당하는 알파벳에 대한 value 를 가져온다. 검사지(choices)에 기록되지 않은 알파벳이라면 Map 객체에 없을 수도 있다. 그래서 이 key 에 대한 value 를 0으로 일단 선언한 후, 두 유형의 점수를 비교한다.

function solution(survey, choices) {
  const res = new Map();

  const returnType = (type1, type2) => {
    const sorted = [type1, type2].sort();
    const mtype1 = res.get(type1) || 0;
    const mtype2 = res.get(type2) || 0;

    if (mtype1 < mtype2) {
      return type2;
    } else if (mtype1 > mtype2) {
      return type1;
    } else {
      return sorted[0];
    }
  };

  const setType = (type, addNum = 0) =>
    res.set(type, (res.get(type) || 0) + addNum);

  for (let i = 0; i < survey.length; i++) {
    const type1 = survey[i][0];
    const type2 = survey[i][1];

    if (choices[i] === 1) setType(type1, 3);
    if (choices[i] === 2) setType(type1, 2);
    if (choices[i] === 3) setType(type1, 1);
    if (choices[i] === 4) {
      setType(type1);
      setType(type2);
    }
    if (choices[i] === 5) setType(type2, 1);
    if (choices[i] === 6) setType(type2, 2);
    if (choices[i] === 7) setType(type2, 3);
  }

  return (
    returnType("R", "T") +
    returnType("C", "F") +
    returnType("J", "M") +
    returnType("A", "N")
  );
}

Leave a comment