2022 KAKAO TECH INTERNSHIP : 성격 유형 검사하기
👉 (프로그래머스) 기출 문제 확인
// 💡 문제 분석 💡
// in : 판단지표기준(문자열배열), 선택번호(자연수배열), out : 성격유형(문자열)
// choices 요소에 따른 점수 : 3(1,7), 2(2,6), 1(3,5), 0(4)
// 번호 4를 기준으로 : 1~3(주어진 문자열 중 앞 유형), 5~7(뒤 유형)
// 번호가 4를 기준으로 어디에 해당하는지 파악 -> 해당유형에서 점수를 계산
// 문제를 전부 푼 후 -> 각 유형의 점수를 파악하고 -> 같은 지표에서 어떤 유형이 더 높은지 확인해야 함
// 1방식(유형 전부의 점수를 파악)
// 2방식(0을 기준으로 양수와 음수 유형을 갈라서, 점수를 각각 +, - -> 결과가 양수인지 음수인지 확인)
function solution(survey, choices) {
let answer = '';
const type = { R: 0, T: 0, C: 1, F: 1, J: 2, M: 2, A: 3, N: 3};
const point = { R: 1, T: -1, C: 1, F: -1, J: 1, M: -1, A: 1, N: -1};
const info = [{ type: ['R', 'T'], point: 0},
{ type: ['C', 'F'], point: 0},
{ type: ['J', 'M'], point: 0},
{ type: ['A', 'N'], point: 0}];
survey.forEach((v, i) => {
const idx = type[v[0]]; // 어떤 지표인지 확인
if (choices[i] > 4) {
info[idx].point += (point[v[1]] * (choices[i] - 4));
} else if (choices[i] < 4) {
info[idx].point += (point[v[0]] * (4 - choices[i]))
}
});
info.forEach((v) => {
if (v.point < 0) {
answer += v.type[1];
} else {
answer += v.type[0];
}
})
return answer;
}
💻 문제 소요시간 : 문제해석, 방향찾기(20m) / 코드작성(35m)
...
두가지 방식 중 2번째 방식으로 풀어봤다.
각 지표의 유형마다 + 유형, - 유형이 존재해서, 토탈 포인트가 양수인지, 음수인지에 따라 유형이 선택되는 방식
원하는대로 풀어가기 위해, 생각보다 셋팅할것이 많았다.
KAKAO 제시 방향
2022 테크 여름인턴십 코딩테스트 해설 참고
- 해시나 배열을 이용하여 각 성격 유형별로 점수를 저장합니다.
- 해시나 조건문을 이용하여 각 설문지에서 선택한 대로 성격 유형에 점수를 부여합니다.
- 모든 문제에 대하여 각 성격 유형에 점수를 부여한 후, 적절한 for 문과 if 문으로 각 지표마다 어떤 성격 유형이 점수가 더 높은지 확인합니다.
- 점수가 같을 경우 사전순으로 빠른 성격 유형을 선택합니다.
function solution(survey, choices) {
const MBTI = {};
const types = ["RT","CF","JM","AN"];
types.forEach((type) =>
type.split('').forEach((char) => MBTI[char] = 0)
)
choices.forEach((choice, index) => {
const [disagree, agree] = survey[index];
MBTI[choice > 4 ? agree : disagree] += Math.abs(choice - 4);
});
return types.map(([a, b]) => MBTI[b] > MBTI[a] ? b : a).join("");
}
대체적으로 모든코드가 각각의 유형의 점수를 파악해, 점수를 비교하는 방법으로 풀어냈었다.
그리고 위 코드는 재사용성이 높을 것 같아 가져와 봤다.
귀찮아서 그런지 다른 사용성을 생각해서인지는 확실히는 모르겠지만,
MBTI 객체를 구성하는 방법을 애초에 작성하지 않고, forEach를 통해 속성의 key 와 value를 초기화했다.
이후 또 눈여겨 본것은
const [disagree, agree] = survey[index]; // 1.
...
return types.map(([a, b]) => MBTI[b] > MBTI[a] ? b : a); // 2.
위의 두줄의 코드
1번 코드는 두자리 문자열을 disagree 와 agree 각각에 쪼개서 넣을 수 있었는데,
이렇게 사용할 수 있다는것을 처음 알았다.
2번도 마찬가지로 types의 요소는 "RT" 등의 두자리 문자열인데, [a, b] 로 입력하니까
각각 a = "R", b = "T" 가 쪼개서 들어가졌다.
신기하당