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;
}