문제 풀이/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
}