[PRG | KAKAO 기출] 성격 유형 검사하기

박예슬·2022년 9월 8일
0

2022 KAKAO TECH INTERNSHIP : 성격 유형 검사하기
👉 (프로그래머스) 기출 문제 확인


My solution

// 💡 문제 분석 💡
// in : 판단지표기준(문자열배열), 선택번호(자연수배열), out : 성격유형(문자열) 
// choices 요소에 따른 점수 : 3(1,7), 2(2,6), 1(3,5), 0(4)
// 번호 4를 기준으로 : 1~3(주어진 문자열 중 앞 유형), 5~7(뒤 유형) 
// 번호가 4를 기준으로 어디에 해당하는지 파악 -> 해당유형에서 점수를 계산
// 문제를 전부 푼 후 -> 각 유형의 점수를 파악하고 -> 같은 지표에서 어떤 유형이 더 높은지 확인해야 함
// 1방식(유형 전부의 점수를 파악) 
// 2방식(0을 기준으로 양수와 음수 유형을 갈라서, 점수를 각각 +, - -> 결과가 양수인지 음수인지 확인)


function solution(survey, choices) {
    let answer = '';
    const type = { R: 0, T: 0, C: 1, F: 1, J: 2, M: 2, A: 3, N: 3};
    const point = { R: 1, T: -1, C: 1, F: -1, J: 1, M: -1, A: 1, N: -1};
    const info = [{ type: ['R', 'T'], point: 0}, 
                 { type: ['C', 'F'], point: 0}, 
                 { type: ['J', 'M'], point: 0}, 
                 { type: ['A', 'N'], point: 0}];
    
    survey.forEach((v, i) => {
        const idx = type[v[0]]; // 어떤 지표인지 확인
        if (choices[i] > 4) {
            info[idx].point += (point[v[1]] * (choices[i] - 4));
        } else if (choices[i] < 4) {
            info[idx].point += (point[v[0]] * (4 - choices[i]))
        }
    });
    
    info.forEach((v) => {
        if (v.point < 0) {
            answer += v.type[1];
        } else {
            answer += v.type[0];
        } 
    })
    
    return answer;
}

💻 문제 소요시간 : 문제해석, 방향찾기(20m) / 코드작성(35m)

...

두가지 방식 중 2번째 방식으로 풀어봤다.
각 지표의 유형마다 + 유형, - 유형이 존재해서, 토탈 포인트가 양수인지, 음수인지에 따라 유형이 선택되는 방식

  1. type 객체를 통해 survey의 해당요소가 몇번째 지표인지 확인을 하고,
  2. 지문 몇번을 선택했는지 확인 후 4를 기준으로 계산해, 어느 유형인지 파악
    (번호가 4인 경우는 0점이라 아예 무시)
  3. point 객체를 활용해서 유형별로 양, 음수 점수값으로 만들어주고 info point에 점수 더해주기
  4. 완성된 info 객체의 point 부호에 따라 앞유형인지 뒤유형인지 알수 있다.
  5. 점수가 같을경우 사전순인데, 모두 앞유형이기 때문에 같이 포함해서 조건 넣어준 것

원하는대로 풀어가기 위해, 생각보다 셋팅할것이 많았다.



Others

KAKAO 제시 방향
2022 테크 여름인턴십 코딩테스트 해설 참고

  • 해시나 배열을 이용하여 각 성격 유형별로 점수를 저장합니다.
  • 해시나 조건문을 이용하여 각 설문지에서 선택한 대로 성격 유형에 점수를 부여합니다.
  • 모든 문제에 대하여 각 성격 유형에 점수를 부여한 후, 적절한 for 문과 if 문으로 각 지표마다 어떤 성격 유형이 점수가 더 높은지 확인합니다.
  • 점수가 같을 경우 사전순으로 빠른 성격 유형을 선택합니다.
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("");
}

대체적으로 모든코드가 각각의 유형의 점수를 파악해, 점수를 비교하는 방법으로 풀어냈었다.
그리고 위 코드는 재사용성이 높을 것 같아 가져와 봤다.
귀찮아서 그런지 다른 사용성을 생각해서인지는 확실히는 모르겠지만,
MBTI 객체를 구성하는 방법을 애초에 작성하지 않고, forEach를 통해 속성의 key 와 value를 초기화했다.
이후 또 눈여겨 본것은

const [disagree, agree] = survey[index];  // 1.
...
return types.map(([a, b]) => MBTI[b] > MBTI[a] ? b : a);  // 2.

위의 두줄의 코드
1번 코드는 두자리 문자열을 disagree 와 agree 각각에 쪼개서 넣을 수 있었는데,
이렇게 사용할 수 있다는것을 처음 알았다.

2번도 마찬가지로 types의 요소는 "RT" 등의 두자리 문자열인데, [a, b] 로 입력하니까
각각 a = "R", b = "T" 가 쪼개서 들어가졌다.

신기하당



Reference

profile
공부중인 개발자

0개의 댓글