알고리즘/프로그래머스 - JS

[프로그래머스 - JS][kakao] level.1 성격 유형 검사하기

개발자성장기 2023. 5. 30. 15:26
반응형

 

 

 

프로그래머스

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

programmers.co.kr


나의 풀이 

function solution(survey, choices) {
  const scores = getScoresByPersonalityType(survey, choices);
  const resultOfPersonalityTypeTest = calculateScores(scores);
  return resultOfPersonalityTypeTest;
}

function getScoresByPersonalityType(survey, choices) {
  // 성격 유형별 점수
  const scores = {
    R: 0,
    T: 0,
    C: 0,
    F: 0,
    J: 0,
    M: 0,
    A: 0,
    N: 0,
  };

  for (let i = 0; i < survey.length; i++) {
    // 모르겠다로 응답했으면 점수 계산 할 필요가 없다.
    // 따라서 4가 나오면 굳이 for문을 다 실행시킬 필요없이 바로 다음index로
    if (choices[i] === 4) continue;
    // 비동의쪽으로 응답했을 때
    if (choices[i] < 4) {
      // survey 왼쪽 캐릭터의 점수를  4 - choices[i] 만큼 올린다.
      // 매우 비동의 : 3점, 비동의 : 2점, 약간 비동의 : 1점이기에  4 - choices[i]를 해줌
      scores[survey[i][0]] += 4 - choices[i];
    } else {
      // 동의쪽으로 응답했을 때
      scores[survey[i][1]] += choices[i] - 4;
    }
  }
  // 계산된 scores 객체 return
  return scores;
}

function calculateScores(scores) {
  let result = ''; // 성격 유형 테스트 결과
  // 1번 지표, 2번 지표, 3번 지표, 4번 지표 순서대로 배열 생성
  const order = ['R', 'T', 'C', 'F', 'J', 'M', 'A', 'N'];

  // n번 지표에서 점수가 더 큰 성격 유형을 result에 넣기
  for (let i = 0; i < order.length; i += 2) {
    // n번 지표에서 성격 유형 점수가 같을 때
    if (scores[order[i]] === scores[order[i + 1]]) {
      // 사전 순으로 빠른 성격 유형을 검사자의 성격 유형으로 판단
      const min = Math.min(order[i].charCodeAt(), order[i].charCodeAt());
      result += String.fromCharCode(min);
      continue;
    }
    // n번 지표에서 성격 유형 검사 점수들이 크거나 작을 때
    // 점수가 더 큰 성경 유형을 결과에 반영
    scores[order[i]] > scores[order[i + 1]]
      ? (result += order[i])
      : (result += order[i + 1]);
  }
  return result;
}

 


다른 사람 풀이 

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

    const aplph = survey.map((v, i) => {
        if(choices[i] > 4) obj[v.substring(1,2)] += choices[i] - 4 
        if(choices[i] < 4) obj[v.substring(0,1)] += 4 - choices[i] 
     })

    obj['R'] >= obj['T'] ? answer +='R' : answer += 'T';
    obj['C'] >= obj['F'] ? answer +='C' : answer += 'F';
    obj['J'] >= obj['M'] ? answer +='J' : answer += 'M';
    obj['A'] >= obj['N'] ? answer +='A' : answer += 'N';

    return answer;
}

 

와 마지막에  obj['R'] >= obj['T'] 를 해주면 필자의 코드처럼 유니코드를 사용할 필요가없다. 

더 빠른 캐릭터를 앞쪽에다 배치시켜서 같은 때는 앞쪽이 선택되어지게끔 하면 조금더 간단한 코드가 된다. 

 

또한 성격 타입이 4쌍이라서 그렇게 많지 않으니 배열에넣어서 순회를 돌리는 등 보다 그냥 반복이 있더라도 이런식으로 

나열하는 것도 괜찮은 것 같다. 

반응형