알고리즘/Swift

programmers: 성격 유형 검사하기 (Swift)

두넌 2023. 5. 14.

https://school.programmers.co.kr/learn/courses/30/lessons/118666

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[survey]에 유형별

"RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA" 

에 해당하는 문자열을 넣고, 우리가 흔히 아는 MBTI처럼 각 지표별로 두가지 성격 유형 중 한가지를 택하게 된다

[choices]는 각 [survey]의 원소들에 해당하는 선택지 즉, 매우 비동의 ~ 매우 동의까지 7가지의 선택지가 존재하고 예를 들어, 입출력 예시 첫번째 경우에서 "AN" 의 choices는 5 이므로, N(네오형)이 1점을 획득하게 되는 것이다

다른 풀이에서는 각각 8가지 성격 유형별로 배열이나 딕셔너리를 만들어서 각 점수를 넣어주는 풀이를 본적이 있는데,

나같은 경우에는 MBTI라는 정수형 배열을 만들어서 각각 짝지어진 성격 유형에 대한 점수를 "AN"의 예시로 A는 +, N은 -의 값을 갖도록 설정하고 'MBTI[0]이 +3 인 경우에는 A가 3점 앞선다' 와 같은 느낌으로 상대적인 점수를 표현하였다

또한, "AN"으로 [choices] 가 주어질 수도 있지만, "NA"처럼 반대로 주어지는 경우도 생각하여 [score]와 [revscore]를 만들어서 각각 반전된 성격 유형 점수를 더해줄 수 있도록 하였고, 이는 isReverse를 통하여 choices 가 반전되었는지 알 수 있다

import Foundation

func solution(_ survey:[String], _ choices:[Int]) -> String {
    var isReverse: Bool = false
    var MBTI: [Int] = [0, 0, 0, 0]
    let score: [Int] = [3, 2, 1, 0, -1, -2, -3]
    let revscore: [Int] = [-3, -2, -1, 0, 1, 2, 3]
    // RT CF JM AN
    var index: Int = 0
    var i: Int = 0
    
    for sur in survey {
        switch(sur) {
        case "RT":
            index = 0
            isReverse = false
        case "CF":
            index = 1
            isReverse = false
        case "JM":
            index = 2
            isReverse = false
        case "AN":
            index = 3
            isReverse = false
            
        case "TR":
            index = 0
            isReverse = true
        case "FC":
            index = 1
            isReverse = true
        case "MJ":
            index = 2
            isReverse = true
        case "NA":
            index = 3
            isReverse = true
            
        default:
            break
        }
        if(isReverse) {
            MBTI[index] += revscore[choices[i]-1]
        } else {
            MBTI[index] += score[choices[i]-1]
        }
        i += 1
    }
    
    var str: String = ""
    if(MBTI[0] >= 0) {
        str.append(contentsOf: "R")
    } else { str.append(contentsOf: "T") }
    
    if(MBTI[1] >= 0) {
        str.append(contentsOf: "C")
    } else { str.append(contentsOf: "F") }
    
    if(MBTI[2] >= 0) {
        str.append(contentsOf: "J")
    } else { str.append(contentsOf: "M") }
    
    if(MBTI[3] >= 0) {
        str.append(contentsOf: "A")
    } else { str.append(contentsOf: "N") }
    
    return str
}

각각의 switch-case 에서 각 survey의 요소 문자열을 분류하여 그에 해당하는 성격 유형의 각 지표의 인덱스(MBTI 배열)을 선택하고 해당 문자열이 반전되었는지(알파벳 순서) 알려주도록 하였다

마지막은 각각의 배열의 값들이 양수인지 음수인지 비교하면서 문자열에 넣어주고 해당 문자열을 리턴해주는 과정을 통하여 성격 유형 검사가 완료되는 것을 볼 수 있다

댓글