[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
💡 로그인 하지 않아도 댓글을 등록할 수 있습니다!