Algorithm
프로그래머스 - 성격 유형 검사하기
b._.omi
2023. 5. 23. 15:18

문제



풀이
성격 유형의 디폴트 값을 'RCJA'로 지정해준다
각 성격유형 쌍을 이루는 배열 ['RT', 'CF', 'JM', 'AN'] 과 이 배열에 매칭되는 [0, 0, 0, 0] 배열을 선언해준다. 이 배열은 각 인덱스의 값이 음수일 경우 각각 [R, C, J, A] 양수일 경우 [T, F, M, N]을 표현한다
survey 배열을 순회하며 survey[i]에 매칭되는 choices[i]의 값이 4보다 클경우 즉, 동의를 선택한 경우와 비동의를 선택한 경우 두가지로 나눈다
이 때 survey[i]의 값이 typeArr에 존재하는 값이라면 즉, 정렬이 되어 있는 상태라면 survey[i]에 매칭되는 typeNum의 인덱스에 choices[i]-4 를 더해준다
반면 survey[i]의 값이 typeArr에 존재하지 않는 값 즉, 정렬이 되어 있지 않다면 survey[i]를 뒤집은 뒤 해당 값에 매칭되는 typeNum의 인덱스에 choices[i]-4 를 빼준다
마지막으로 typeNum를 순회하며 각 인덱스의 값이 양수라면 디폴트값을 변경해준다
function solution(survey, choices) {
// 초기값
let answer = 'RCJA';
let typeArr = ['RT', 'CF', 'JM', 'AN'];
let typeNum = [0, 0, 0, 0];
for(let i = 0; i < survey.length; i++){
// 동의를 선택한 경우
if(choices[i] > 4) {
// survey의 값이 typeArr에 존재하는 값이라면 즉, 정렬된 경우
if(typeArr.includes(survey[i]))
typeNum[typeArr.indexOf(survey[i])] += choices[i]-4;
// 존재하지 않는다면 즉, 정렬되어 있지 않은 경우
else
typeNum[typeArr.indexOf(survey[i].split('').reverse().join(''))] -= choices[i] - 4;
}
// 비동의를 선택한 경우
else {
if(typeArr.includes(survey[i]))
typeNum[typeArr.indexOf(survey[i])] += choices[i] - 4;
else
typeNum[typeArr.indexOf(survey[i].split('').reverse().join(''))] -= choices[i] - 4;
}
}
// 각 인덱스 값이 양수라면 디폴트값 변경
for(let i = 0; i < typeNum.length; i++){
if(typeNum[i] > 0) answer = answer.replace(typeArr[i][0], typeArr[i][1]);
}
return answer;
}