성격 유형 검사하기(level1)

원용현·2022년 8월 20일
0

프로그래머스

목록 보기
5/49

링크

https://school.programmers.co.kr/learn/courses/30/lessons/118666

문제

성격 유형 문제를 만들 때, 각 검사 항목에 대해 선택할 수 있는 값은 다음과 같다.
매우 비동의 / 비동의 / 약간 비동의 / 모르겠음 / 약간 동의 / 동의 / 매우 동의
이 때 각 선택에 따라서 어떤 유형의 문제이냐에 따라서 주어지는 점수가 달라진다. 모르겠음을 0점으로 기준삼아 위 아래로 1점 씩 추가되어 점수가 주어진다.

예를 들어 RT형 문제에서 매우 동의를 선택하게 되면 T 성격 유형에 3점이 추가된다. 반대로 NA형 문제에서 매우 비동의를 선택하게 되면 N 성격 유형에 3점이 추가된다.

각 문제의 성격 유형과 선택지가 주어졌을 때 검사자의 성격 유형 결과를 지표 순서대로 반환하라.

예제로 이해

위와 같이 값이 주어졌을 때 survey와 choices의 같은 index에 위치한 값을 가지고 성격 유형 검사 결과를 도출해 내야한다.
가장 먼저 0번 인덱스의 AN에 대한 선택 값이 5 이므로 위의 그림을 참고하여 무엇을 선택했는지 판단한다.
이 경우에는 AN에 대해서 약간 동의를 선택하였으므로 N 성격 유형에 대해서 1점이 추가된다.

차례대로 나머지 선택에 대해서 값을 도출하면 CF - 3 이므로 C 유형 1점, MJ - 2 이므로 M 유형 2점, RT - 7 이므로 T 유형 3점, NA - 5 이므로 A 유형 1점이 각각 추가된다.

예제의 결과를 나타내면 다음과 같다.
결과를 보고 각 지표에서 더 높은 성격 유형 점수를 가진 쪽을 출력해주면 된다.

1, 2, 3번 지표에 대해서 각각 T, C, M 형의 성격 유형을 가지게 되는데 4번 지표의 경우에는 두 성격 유형의 점수가 같은 것을 볼 수 있다. 이런 경우에는 사전 순서대로 더 빨리 나오는 것의 성격 유형을 출력해주도록 한다. 따라서 4번 지표에 대해서는 A 성격 유형을 가지게 된다.

따라서 결과로는 TCMA 성격 유형을 반환해주도록 한다.

코드

function solution(survey, choices) {
  	const score = [-3, -2, -1, 0, 1, 2, 3]
    let arr = [0, 0, 0, 0]
    let result = ""
    
    survey.map((el, idx) => {
        switch(el) {
            case 'RT':
                arr[0] += score[choices[idx] - 1]
                break
            case 'TR':
                arr[0] -= score[choices[idx] - 1]
                break
            case 'CF':
                arr[1] += score[choices[idx] - 1]
                break
            case 'FC':
                arr[1] -= score[choices[idx] - 1]
                break
            case 'JM':
                arr[2] += score[choices[idx] - 1]
                break
            case 'MJ':
                arr[2] -= score[choices[idx] - 1]
                break
            case 'AN':
                arr[3] += score[choices[idx] - 1]
                break
            case 'NA':
                arr[3] -= score[choices[idx] - 1]
                break
        }
    })
        
    arr.map((el,idx) => {
        switch(idx) {
            case 0:
                result += (el <= 0 ? "R" : "T")
                break
            case 1:
                result += (el <= 0 ? "C" : "F")
                break
            case 2:
                result += (el <= 0 ? "J" : "M")
                break
            case 3:
                result += (el <= 0 ? "A" : "N")
                break
        }
    })
    
    return result
}

코드 풀이

풀이 방법에는 코드를 작성하는 사람마다 다를 수 있음을 먼저 이야기하고 시작하겠다. 내가 접근한 방법은 switch - case 문을 사용해서 RT와 TR 유형의 문제에 대해서 같은 인덱스에 값을 저장해서 풀이를 해주었다.

예를 들어 RT에서 매우 비동의를 선택하고 TR에서도 매우 비동의를 선택할 경우 주체가 되는 R에 대해서 -3점, T에 대해서 -3점을 진행하고 이 값을 같은 곳에 저장하면 합계 0점이 나오는 식으로 코드를 구성하였다.

계산 결과 값이 음수라면 RT나 TR에 대해 사전 정렬된 결과로 앞의 것이 성격 유형으로 들어가고 양수라면 뒤의 것이 성격 유형 결과로 들어간다. 즉, RT나 TR에 대해서 계산된 결과들이 저장된 변수의 값이 음수면 성격 유형의 결과는 R이고 양수이면 성격 유형의 결과는 T가 된다.

const score = [-3, -2, -1, 0, 1, 2, 3]
let arr = [0, 0, 0, 0]
let result = ""

score 배열은 choices에서 가져온 값에 따른 점수를 넣어놓은 배열이다. choices에서 가져온 값에 -1한 값으로 index 번호를 통해 해당 배열에 접근해서 점수를 부여한다.

arr는 각 지표 별 점수를 합산한 결과를 저장하는 배열이다. R-T는 0번 인덱스, C-F는 1번 인덱스 J-M은 2번 인덱스 A-N은 3번 인덱스에 결과가 저장된다

result는 arr에 저장된 결과를 가지고 각 지표 별로 어떤 성격 유형을 가지고 있는지 저장되는 string이다.

첫 번째 switch문에서는 들어올 수 있는 경우에 대해서 값을 처리해 주었다. 물론 모든 경우에 대해서 처리를 하는 것은 안좋은 코드이지만, 이 문제의 경우에는 들어올 수 있는 경우의 수가 적기 때문에 위와 같이 처리를 해주었다.

들어오는 값을 예로 들면 RT인지 TR인지에 대해서 같은 arr에 처리를 해주지만 처리를 하는 곳은 같은 index를 가지는 위치이며 그 결과를 +인지 -인지만 다르다.

두 번째 switch문에서는 계산된 결과를 가지고 반환 해줄 string을 작업한다. 여기서도 역시 4개의 case에 대해서만 작업이 이루어지기 때문에 시간복잡도를 고려하지 않은 코드를 작성했다.

index에 따라서 결과 값이 0을 기준으로 크냐 작냐에 따라서 R과 T 중에 결정해주고, C와 F 중에 결정해주고, J와 M 중에 결정해주고, A와 N 중에 결정해준다.

반복문이 끝나면 만들어진 string을 return 해주는 것으로 끝마친다.

0개의 댓글