본문 바로가기
코테연습

88. 성격 유형 검사하기 Javascript

by hxunz 2022. 8. 22.

https://school.programmers.co.kr/learn/courses/30/lessons/118666?language=javascript 

 

프로그래머스

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

programmers.co.kr

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 구하라
  • 주어진 자료는 무엇인가?
     - survey : 질문마다 판단하는 지표를 담은 1차원 문자열 배열
     - choices : 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열
  • 조건은 무엇인가?
     - 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단한다.
매우 동의나 매우 비동의 선택지를 선택하면 3점을 얻습니다.
동의나 비동의 선택지를 선택하면 2점을 얻습니다.
약간 동의나 약간 비동의 선택지를 선택하면 1점을 얻습니다.
모르겠음 선택지를 선택하면 점수를 얻지 않습니다.

 

2. 계획

  • 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가? Map

 

  1. 성격 유형 점수를 계산한 결과를 정리하기 위해서 Map을 이용해서 점수판을 만든다.
  2. 문자열2개를 임의로 왼쪽, 오른쪽으로 나눈다.
  3. choices의 점수에 따라서 왼쪽이나 오른쪽에 있는 문자열에 점수를 더해준다. (1~3점은 왼쪽에 더해주고 5~7점은 오른쪽에 더해준다.)
  4. 각 지표에서 점수가 더 높은 성격유형을 고르기 위해서 빈 배열을 하나 만들어준다.
    R의 점수가 T보다 높거나 같다면(R이 T보다 알파벳 순서가 우선이기때문) R을 빈 배열에 넣는다
    C의 점수가 F보다 높거나 같다면(C이 F보다 알파벳 순서가 우선이기때문) C를 빈 배열에 넣는다
    J의 점수가 M보다 높거나 같다면(J이 M보다 알파벳 순서가 우선이기때문) J를 빈 배열에 넣는다
    A의 점수가 N보다 높거나 같다면(A이 N보다 알파벳 순서가 우선이기때문) A를 빈 배열에 넣는다
  5. 이렇게 구한 문자열들을 한 단어로 나타내기 위해서 join("")을 해주고 이 값을 리턴한다.

 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.

첫번째 풀이

const solution = (survey, choices) => {
  let category = {
    'R': 0,
    'T': 0,
    'C': 0,
    'F': 0,
    'J': 0,
    'M': 0,
    'A': 0,
    'N': 0,
  };

  for (i = 0; i < survey.length; i++) {
    const left = survey[i][0];
    const right = survey[i][1];

    if (choices[i] === 1) {
      category[left] = category[left] + 3
    } else if (choices[i] === 2) {
      category[left] = category[left] + 2
    } else if (choices[i] === 3) {
      category[left] = category[left] + 1
    } else if (choices[i] === 5) {
      category[right] = category[right] + 1
    } else if (choices[i] === 6) {
      category[right] = category[right] + 2
    } else if (choices[i] === 7) {
      category[right] = category[right] + 3
    }
  }


  let result = [];

  if (category['R'] > category['T'] === true || category['R'] === category['T']) {
    result.push('R')
  } else {
    result.push('T')
  }

  if (category['C'] > category['F'] === true || category['C'] === category['F']) {
    result.push('C')
  } else {
    result.push('F')
  }

  if (category['J'] > category['M'] === true || category['J'] === category['M']) {
    result.push('J')
  } else {
    result.push('M')
  }

  if (category['A'] > category['N'] === true || category['A'] === category['N']) {
    result.push('A')
  } else {
    result.push('N')
  }

  return result.join('');
}

 

두번째 풀이

const solution = (survey, choices) => {
  let category = {
    'R': 0,
    'T': 0,
    'C': 0,
    'F': 0,
    'J': 0,
    'M': 0,
    'A': 0,
    'N': 0,
  };

  for (i = 0; i < survey.length; i++) {
    const [left, right] = survey[i];

    if (choices[i] >= 5) {
      category[right] = category[right] + (choices[i] - 4);
    } else {
      category[left] = category[left] + (4 - choices[i]);
    }
  }

  const r = [
    ['R', 'T'],
    ['C', 'F'],
    ['J', 'M'],
    ['A', 'N'],
  ];

  return r.map(([left, right]) => category[left] >= category[right] ? left : right).join('');
}


test('surveyResult', () => {
  expect(solution(["AN", "CF", "MJ", "RT", "NA"], [5, 3, 2, 7, 5])).toEqual("TCMA");
});

 

처음에 Map을 활용할 줄 몰라서 일일히 if문으로 예외처리를 하느라 코드가 엉망이었다.
그러다가 Map을 사용해서 해결 할 수 있다는 것을 알았고 Map을 사용해서 전보다는 코드가 간결해졌지만, 
더 간단하게 풀 수 있는 방법이 있을 것 같다. 
고민해봐야겠다.

매핑과 destructuring을 사용하면 더 간단해진다.
리팩터링을 하면서 코드를 더 간단하게 작성해보았다.

 

댓글