[lv.1] 성격 유형 검사하기 | 프로그래머스
[lv.1] 성격 유형 검사하기 | 프로그래머스
📋 [ 프로그래머스 ] 시리즈 몰아보기 (17)
✏️ (lv.1) : 성격 유형 검사하기
나만의 카카오 성격 유형 검사지를 만들려고 한다. 성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분한다. 성격은 각 지표에서 두 유형 중 하나로 결정된다.
지표 번호 | 성격 유형 |
---|---|
1번 지표 | 라이언형(R), 튜브형(T) |
2번 지표 | 콘형(C), 프로도형(F) |
3번 지표 | 제이지형(J), 무지형(M) |
4번 지표 | 어피치형(A), 네오형(N) |
4개의 지표가 있으므로 성격 유형의 조합은 총 16개이다. 예를들어 "RFMN"
이나 "TCMA"
와 같은 성격 유형이 있다.
검사지에는 총 n
개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 존재한다.
매우 비동의
비동의
약간 비동의
모르겠음
약간 동의
동의
매우 동의
각 질문은 1가지 지표로 성격 유형 점수를 판단한다. 예를들어 어떤 한 질문에서 4번지표(A, N)를 기준으로 점수를 매긴다고 하였을 때 다음과 같이 점수를 매길 수 있다.
선택지 | 성격 유형 점수 |
---|---|
매우 비동의 |
N형 3점 |
비동의 |
N형 2점 |
약간 비동의 |
N형 1점 |
모르겠음 |
A, N 모두 0점 |
약간 동의 |
A형 1점 |
동의 |
A형 2점 |
매우 동의 |
A형 3점 |
만약 검사자가 약간 동의
를 선택할 경우 어피치형(A)
1점을 받게 된다. 매우 비동의
를 선택할 경우 네오(N)
형 3점을 받게 된다.
각 선택지는 지표나 성격 유형에 관계없이 고정된 크기의 점수를 가지고 있으며 각 질문별로 다른 지표를 참고할 수 있다. 또한 같은 4번 지표라도 A가 동의인 경우가 아닌 N이 동의인 경우 또한 주어질 수 있다.
검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단하되 하나의 지표에서 각 성격 유형 점수가 같다면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라 판단한다.
질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey
와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices
가 주어질 때 검사자의 성격 유형 검사 결과를 return하는 solution을 작성하라.
- 1 {'<='}
survey.length
<= 1000survey
의 원소는"RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA"
중 하나이다.survey[i]
의 첫 번째 문자는i+1
번 질문의비동의
관련 선택지를 선택하면 할당되는 성격 유형을 뜻한다.survey[i]
의 두 번째 문자는i+1
번 질문의동의
관련 선택지를 선택하면 할당되는 성격 유형을 뜻한다.
choices.length
=survey.length
- 1 {'<='}
choices
의 각 원소 {'<='} 7 choices[i]
는 검사자가 선택한i+1
번쨰 질문의 선택지를 뜻한다.
- 1 {'<='}
객체
를 이용해 성격 유형(이하 MBTI)별 획득 점수를 기록하고 MBTI의 value를 비교해 문제를 해결한다.
- 4개의 지표를 대표하는 배열
types
를 선언하고"RT"
,"CF"
,"JM"
,"AN"
을 원소로 할당한다. - 성격 유형별 점수를 기록할 객체
MBTI
를 선언하고 객체의key
로는 유형의 명칭을,value
로는 최초값인0
을 할당한다. choices
를choice
와index
로 순회하며 다음 로직을 수행한다.survey[index]
의 값을[disagree, agree]
로 쪼개어 선언한다.choice
- 4의 절대값을 할당된 점수라고 가정한다.choice
{'>'} 4인 경우MBTI[agree]
에 할당된 점수를, 그렇지 않은 경우MBTI[disagree]
에 할당된 점수를 부여한다.
types
의 각 원소를[a, b]
로 쪼개어map()
을 이용해 순회하며 다음 로직을 수행한다.MBTI[b]
{'>'}MBTI[a]
인 경우b
를, 그렇지 않을 경우a
를 return한다.
- 순회가 끝나고 새로 반환된 배열을
join("")
을 이용해 문자열로 변환하여 return한다.
1 | // 개선판 |
2 | function betterSolution(survey, choices) { |
3 | const MBTI = {}; |
4 | const types = ["RT", "CF", "JM", "AN"]; |
5 | |
6 | types.forEach(type => type.split("").forEach(char => (MBTI[char] = 0))); |
7 | |
8 | choices.forEach((choice, index) => { |
9 | const [disagree, agree] = survey[index]; |
10 | |
11 | MBTI[choice > 4 ? agree : disagree] += Math.abs(choice - 4); |
12 | }); |
13 | |
14 | return types.map(([a, b]) => (MBTI[b] > MBTI[a] ? b : a)).join(""); |
15 | } |
16 | |
17 | |
18 | |
19 | // 처음 작성했던 코드... |
20 | function solution(survey, choices) { |
21 | let result = ""; |
22 | const compareSheet = { |
23 | R: 0, |
24 | T: 0, |
25 | C: 1, |
26 | F: 1, |
27 | J: 2, |
28 | M: 2, |
29 | A: 3, |
30 | N: 3, |
31 | }; |
32 | const myMBTI = [ |
33 | { R: 0, T: 0 }, |
34 | { C: 0, F: 0 }, |
35 | { J: 0, M: 0 }, |
36 | { A: 0, N: 0 }, |
37 | ]; |
38 | |
39 | survey.forEach((item, i) => { |
40 | let target = item.split(""); |
41 | let givenScore = 4 - choices[i]; |
42 | |
43 | if (givenScore > 0) { |
44 | myMBTI[compareSheet[target[0]]][target[0]] += givenScore; |
45 | } else if (givenScore < 0) { |
46 | myMBTI[compareSheet[target[1]]][target[1]] += Math.abs(givenScore); |
47 | } |
48 | }); |
49 | |
50 | myMBTI.forEach((item, i) => { |
51 | let target = Object.entries(item).sort((a, b) => { |
52 | if (a[1] === b[1]) { |
53 | return a[0] - b[0]; |
54 | } else { |
55 | return b[1] - a[1]; |
56 | } |
57 | }); |
58 | |
59 | result += target[0][0]; |
60 | }); |
61 | |
62 | return result; |
63 | } |
👨💻 관련 포스트
[lv.1] 대충 만든 자판 | 프로그래머스
[lv.1] 대충 만든 자판 | 프로그래머스
프로그래머스 lv.1 대충 만든 자판 풀이 with javascript. javascript 객체를 이용해 keymap에 존재하는 알파벳의 index를 기록하되 가장 최단거리에 해당하는 키캡의 index를 기록하여 통합된 자판을 생성하여 문제를 해결한다.
2023-05-28
[lv.1] 개인정보 수집 유효기간
[lv.1] 개인정보 수집 유효기간
프로그래머스 lv.1 개인정보 수집 유효기간 풀이 with javascript. 해당 문제에서 한달은 28일로 고정이다. 따라서 today와 privacies 각 원소(개인정보)의 날짜를 년, 월, 일에 각 단위에 해당하는 수 * 28을 수행하여 일 단위로 변환한 후 terms에 해당하는 수를 더해 문제를 해결한다.
2023-05-30
[lv.2] 주차 요금 계산 | 프로그래머스
[lv.2] 주차 요금 계산 | 프로그래머스
프로그래머스 lv.2 주차 요금 계산 풀이 with javascript. javascript의 객체를 이용해 차량의 입/출차 시간을 기록, 해당 객체를 순회하며 주차시간을 주어진 요금표에 맞게 정산하는 것으로 문제를 해결한다.
2023-06-04
💡 로그인 하지 않아도 댓글을 등록할 수 있습니다!