https://school.programmers.co.kr/learn/courses/30/lessons/118666
[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 배열)을 선택하고 해당 문자열이 반전되었는지(알파벳 순서) 알려주도록 하였다
마지막은 각각의 배열의 값들이 양수인지 음수인지 비교하면서 문자열에 넣어주고 해당 문자열을 리턴해주는 과정을 통하여 성격 유형 검사가 완료되는 것을 볼 수 있다
댓글