본문 바로가기
[프로그래머스]

[js] 프로그래머스 - 성격 유형 검사하기

by 쥰5017 2022. 8. 26.

 

프로그래머스 2022 KAKAO TECH INTERNSHIP에 등재된 lv.1 문제를 풀어봤다.

 

성격 유형 검사지를 통해

RT / CF / JM / AN 의 성향을 검사해 TCMA 등의 유형으로 결정하는 검사이다.

구조적인 것은 최근 유행했던 MBTI 성격 유형과 같다.

 

검사지는 배열로 입력되며, 배열의 요소가 각 유형별 문항이라 할 수 있고, 피검사자의 선택 또한 배열로 입력된다.

입력의 예시는 다음과 같다.

 

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

 

이 때 피검사자의 응답 선택에 따라 각 유형의 점수가 매겨지는데 예를 들어 문항 "AN"의 경우 점수는 다음과 같고, 첫 번째 케이스의 첫 번째 문항에서 피검사자가 5를 답했으므로 네오형 1점을 획득하는 것이다.

 

choices 선택지 성격 유형 점수
1 매우 비동의 어피치형 3점
2 비동의 어피치형 2점
3 약간 비동의 어피치형 1점
4 모르갰음 0점
5 약간 동의 네오형 1점
6 동의 네오형 2점
7 매우 동의 네오형 3점

 

 

1. 우선 각 문항별 점수를 저장할 변수를 소문자 r, t, f, c, m, j, a, n으로 정해주었다. 이 변수들에 문항별 획득 점수를 저장하고 마지막에 유형별로 비교하여 검사 결과를 출력할 계획이다.

 

var r, t, f, c, m, j, a, n;
    r = t = f = c = m = j = a = n = 0;

 

 

2. 문항별로 케이스를 나누고 케이스별로 피검사자가 고른 선택지를 반영하여 점수를 부여한다.

 

for (let i = 0; i < survey.length; i++) {
        if (survey[i] == 'RT') {
            (choices[i] < 4) ? r += 4 - choices[i] : t += choices[i] - 4;
        } else if (survey[i] == 'TR') {
            (choices[i] < 4) ? t += 4 - choices[i] : r += choices[i] - 4;        
        } else if (survey[i] == 'FC') {
            (choices[i] < 4) ? f += 4 - choices[i] : c += choices[i] - 4;           
        } else if (survey[i] == 'CF') {
            (choices[i] < 4) ? c += 4 - choices[i] : f += choices[i] - 4;            
        } else if (survey[i] == 'MJ') {
            (choices[i] < 4) ? m += 4 - choices[i] : j += choices[i] - 4;            
        } else if (survey[i] == 'JM') {
            (choices[i] < 4) ? j += 4 - choices[i] : m += choices[i] - 4;            
        } else if (survey[i] == 'AN') {
            (choices[i] < 4) ? a += 4 - choices[i] : n += choices[i] - 4;
        } else if (survey[i] == 'NA') {
            (choices[i] < 4) ? n += 4 - choices[i] : a += choices[i] - 4;
        }
    };

 

이 부분을 풀 때 처음에 정말 바보같이 switch문을 작성하여 choices를 1점부터 7점까지 모두 적었더라는..... 더 간단하게 풀 수 있다는 걸 다른 분들 풀이를 보고 깨달았다. 그래서 고친 모양이 위의 삼항 연산자를 사용한 코드이다.

 

*) 이보다도 더 간단하고도 누구나 알기 쉬운 방법이라고 생각하는 풀이를 발견했다. (정말 내가 바보인지 우리나라 사람들이 천재인지,,,,🙄) 나는 정직하게도 survey의 문항별로 케이스를 나누었는데, 반대로 choices를 먼저 고려하여 choices의 선택지가 높은 수이면 문항의 뒷글자를, 낮은 수이면 문항의 앞글자를 취하는 구조이다. 

 

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] 
     })

 

(신동우 님의 풀이에서 발췌했습니다. 감사합니다.)

이 풀이는 각 유형을 객체의 key 값으로 저장하고, 유형별 점수를 객체의 value 값으로 저장하였기에 풀이에 obj가 들어간다. 아무튼 간단명료하다.

 

 

3. 마지막으로 각 유형별 점수를 비교하여 성격 유형을 도출한다.

 

(r >= t) ? answer += 'R' : answer += 'T';   
(c >= f) ? answer += 'C' : answer += 'F';    
(j >= m) ? answer += 'J' : answer += 'M';       
(a >= n) ? answer += 'A' : answer += 'N';

 

이 부분도 처음에 if문으로 작성했다가 윗 부분을 고치면서 같이 고쳤다. 훨씬 간결해졌다. 삼항연산자 만세!

 

 

 

마무리.

 

function solution(survey, choices) {
    var answer = '';
    var r, t, f, c, m, j, a, n;
    r = t = f = c = m = j = a = n = 0;
    
    for (let i = 0; i < survey.length; i++) {
        if (survey[i] == 'RT') {
            (choices[i] < 4) ? r += 4 - choices[i] : t += choices[i] - 4;
        } else if (survey[i] == 'TR') {
            (choices[i] < 4) ? t += 4 - choices[i] : r += choices[i] - 4;        
        } else if (survey[i] == 'FC') {
            (choices[i] < 4) ? f += 4 - choices[i] : c += choices[i] - 4;           
        } else if (survey[i] == 'CF') {
            (choices[i] < 4) ? c += 4 - choices[i] : f += choices[i] - 4;            
        } else if (survey[i] == 'MJ') {
            (choices[i] < 4) ? m += 4 - choices[i] : j += choices[i] - 4;            
        } else if (survey[i] == 'JM') {
            (choices[i] < 4) ? j += 4 - choices[i] : m += choices[i] - 4;            
        } else if (survey[i] == 'AN') {
            (choices[i] < 4) ? a += 4 - choices[i] : n += choices[i] - 4;
        } else if (survey[i] == 'NA') {
            (choices[i] < 4) ? n += 4 - choices[i] : a += choices[i] - 4;
        }
    };
    
    (r >= t) ? answer += 'R' : answer += 'T';   
    (c >= f) ? answer += 'C' : answer += 'F';    
    (j >= m) ? answer += 'J' : answer += 'M';       
    (a >= n) ? answer += 'A' : answer += 'N';
       
    return answer;
}

 

반성) 더 간단한 방법이 있는지 항상 고민할 것. 문제를 풀 때 한 방향으로만 고민하지 말고 여러 가지 방향에서 접근해 볼 것.

댓글