문제 풀이/Javascript

[Programmers] [Javascript] 성격 유형 검사하기

일 월 2022. 9. 14. 20:53

코딩테스트 연습 - 성격 유형 검사하기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 

문제

성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분하고, 성격은 각 지표에서 두 유형 중 하나로 결정됨 ("RFMN", "TCMA" 등)

지표 번호 성격 유형
1번 지표 라이언형(R), 튜브형(T)
2번 지표 콘형(C), 프로도형(F)
3번 지표 제이지형(J), 무지형(M)
4번 지표 어피치형(A), 네오형(N)

 

검사지에는 총 n개의 질문이 있고, 각 질문은 7개의 선택지 중 1가지 지표로 성격 유형 점수를 판단함

성격 유형이 "AB"로 주어진다면, 각 선택지에 따른 유형 점수는 다음과 같음

선택지성격  유형 점수
매우 비동의 A형 3점
비동의 A형 2점
약간 비동의 A형 1점
모르겠음 어떤 성격 유형도 점수를 얻지 않습니다
약간 동의 B형 1점
동의 B형 2점
매우 동의 B형 3점

 

검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단하고, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단함

질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어질 때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 반환

 


제한사항

  • 1 ≤ survey의 길이 ( = n) ≤ 1,000
    • survey의 원소는 "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 중 하나
    • survey[i]의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 선택지를 선택하면 받는 성격 유형을 의미
    • survey[i]의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 선택하면 받는 성격 유형을 의미

choices의 길이 = survey의 길이

  • choices[i]는 검사자가 선택한 i+1번째 질문의 선택지를 의미
  • 1 ≤ choices의 원소 ≤ 7

 

choices 원소 의미
1 매우 비동의
2 비동의
3 약간 비동의
4 모르겠음
5 약간 동의
6 동의
7 매우 동의

 

 


최초 풀이

function solution(survey, choices) {
    let answer = ''
    const kind = {'RT':0, 'CF':0, 'JM':0, 'AN':0}
    survey.forEach((type, index) => {
        // survey의 요소와 kind의 key값 일치 여부 확인
        if (type in kind) {
            kind[type] += choices[index] - 4
        } else {
            const key = type[1] + type[0]
            kind[key] -= choices[index] - 4
        }
    })
    // kind에서 유형 찾기
    for (let key in kind) {
        if (kind[key] <= 0) {
            answer += key[0]
        } else {
            answer += key[1]
        }
    }
    return answer
}

해설

1. 같은 지표 번호 내의 성격유형을 오름차순으로 묶어서 객체 kind 의 키로 설정하고, 값은 0으로 설정한다.
(첫 번째 지표에서는 "RT"가 된다, 여기서의 값은 유형 점수를 의미한다)

2. survey의 요소가 kind의 키와 일치하는지 확인한다.

3. 일치한다면(survey의 요소는 오름차순으로 정렬된 상태) kind[survey의 요소]에
choices[해당 인덱스의 값] - 4를 더해준다
(kind의 키에서 어떤 유형에 해당하는지 구별해주기 위해 4를 빼주었다 - 값이 음수이면 첫 번째 유형에 해당하고
값이 양수이면 두 번째 유형에 해당함)

4. 일치하지 않는다면 키 값의 순서를 바꿔준 후, kind[survey의 요소 뒤집은 값]에
choices[해당 인덱스의 값] - 4를 빼준다
(순서가 바뀌었으므로 더해주는 것이 아니라 빼준다.)

5. kind에 값을 모두 채웠으면, 반복문을 통해 성격 유형을 answer에 추가해준다. 값이 음수 또는 0이면
첫 번째 값을, 양수이면 두 번째 값을 추가해준다.

다른 풀이

function solution(survey, choices) {
    let answer = ''
    const kind = {'RT':0, 'CF':0, 'JM':0, 'AN':0}
    survey.forEach((type, index) => {
        // survey의 요소와 kind의 key값 일치 여부 확인
        if (type in kind) {
            kind[type] += choices[index] - 4
        } else {
            const key = type[1] + type[0]
            kind[key] -= choices[index] - 4
        }
    })
    // kind에서 유형 찾기
    for (let key in kind) {
    // true는 1, false는 0임을 이용 -> boolean * 1을 하면 숫자로 변환됨을 이용
        answer += key[(kind[key] > 0)*1]
    }
    return answer
}