티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/118666?language=swift
안녕하세요.
간만에 프로그래머스에서 재밌는 문제를 발견해서 같이 풀이해볼까 합니다.
유형이 좀 지나긴 했으나 MBTI를 따라한 것 같은 문제더라고요
생각보다 어렵지 않은 문제입니다.
간단하게 상황부터 정리해봅시다.
문제 상황
카카오에서 MBTI 와 유사한 성격 유형 검사지를 만드려고 합니다.
- 1번 지표 라이언형(R), 튜브형(T)
- 2번 지표 콘형(C), 프로도형(F)
- 3번 지표 제이지형(J), 무지형(M)
- 4번 지표 어피치형(A), 네오형(N)
각 유형별 점수가 동점일 경우 알파벳 순위가 높은 유형으로 표시합니다.
(A 점수와 N 점수가 동일시 A로 표기, 예를 들어 모두 0 점 인경우 "RCJA" 로 표시)
각 검사 후 survey 와 choices 배열이 주어집니다.
choices 뜻
1 매우 비동의 (3점)
2 비동의 (2점)
3 약간 비동의 (1점)
4 모르겠음 (0점)
5 약간 동의 (1점)
6 동의 (2점)
7 매우 동의 (3점)
survey 와 choices 의 갯수는 늘 동일하게 제공되고
survey 의 항목의 첫번째 글자는 비동의시 점수 / 마지막글자는 동의시 점수를 획득하는 유형을 나타냅니다.
ex) "RT" , "7" 인경우 T 항목을 3점 획득한 걸로 인식
survey (String 배열) 와 choices (Int 배열) 을 입력받아 알맞은 성격유형(String)이 출력되도록 함수를 만들어주세요.
(단 알파벳은 지표순으로 나열되어야 한다.)
정답 예시
survey | choices | result |
["AN", "CF", "MJ", "RT", "NA"] | [5, 3, 2, 7, 5] | "TCMA" |
["TR", "RT", "TR"] | [7, 1, 3] | "RCJA" |
문제 풀이 (swift)
두가지 부분으로 나누어 하면 생각보다 별거 없는 문제입니다.
(개인 취향이긴 한데 저는 함수를 나눠 만드는걸 좋아해서 나눠서 제작하겠습니다.)
1. 각 항목 별 점수 누적으로 계산
2. 각 항목 비교 후 String 추출
여기서 중요한 부분은 각 항목 점수를 어떻게 저장하느냐겠죠?
저는 아래처럼 딕셔너리 타입을 통해 저장하겠습니다.
var mbtiDict = ["R":0, "T":0,"C":0,"F":0,"J":0,"M":0,"A":0,"N":0]
자 그럼 이제 각 항목별로 점수를 누적으로 쌓아봅시다.
저는 각 점수 계산을 원활하게 하기위해 아래 함수를 따로 제작했어요.
func getScore(survey : String, score: Int) ->(String,Int) {
if(score == 4){
return ("",0)
}else if(score < 4){
return (String(survey.first!),4-score)
}else{
return (String(survey.last!),score-4)
}
}
이 함수는 예를 들어
getScore(survey: "RT", score: 7) 이런식으로 넣으면 ("T",3) 이런식으로 나오는 함수에요
그럼 이 점수를 위 딕셔너리에 합산해주면 되겠죠?
var mbtiDict = ["R":0, "T":0,"C":0,"F":0,"J":0,"M":0,"A":0,"N":0]
for i in 0..<survey.count{
if(choices[i] != 4){ // 4인경우 따로 계산할필요가 없음
//합산해야하는 값 출력
let addScore = self.getScore(survey: survey[i], score: choices[i])
let nowScore = mbtiDict[addScore.0]
mbtiDict.updateValue((nowScore ?? 0) + addScore.1, forKey: addScore.0)
}
}
print(mbtiDict) // 합산된 딕셔너리 값 출력
* 값이 4인 경우 따로 계산을 해줄 필요가 없기때문에 넘어가도록 합니다. (불필요한 계산 넘기기)
자 여기까지가 1단계입니다.
2단계는 훨씬 쉬워요
지금까지 만든 딕셔너리의 값들을 비교해 MBTI를 만들어주시면 됩니다.
아래처럼 말이죠.
func setMBTI(resultDict : [String : Int]) -> String{
let mbtiRT = resultDict["R"]!>=resultDict["T"]! ? "R":"T"
let mbtiCF = resultDict["C"]!>=resultDict["F"]! ? "C":"F"
let mbtiJM = resultDict["J"]!>=resultDict["M"]! ? "J":"M"
let mbtiAN = resultDict["A"]!>=resultDict["N"]! ? "A":"N"
return mbtiRT + mbtiCF + mbtiJM + mbtiAN
}
간단하죠?
저 문법이 어색하신 분들을 위해 잠깐 설명드리면 저건 삼항연산자라고 하는 친구입니다.
아래와 같은 원리라고 생각하시면 됩니다.
변수 = 조건문 ? 조건문이참이면 : 조건문이거짓이면
최종 코드
자 이제 1단계랑 2단계를 합쳐서 코드를 완성해봅시다.
func solution(_ survey:[String], _ choices:[Int]) -> String {
var mbtiDict = ["R":0, "T":0,"C":0,"F":0,"J":0,"M":0,"A":0,"N":0]
for i in 0..<survey.count{
if(choices[i] != 4){
let addScore = self.getScore(survey: survey[i], score: choices[i])
let nowScore = mbtiDict[addScore.0]
// 점수 누적 계산
mbtiDict.updateValue((nowScore ?? 0) + addScore.1, forKey: addScore.0)
}
}
//print(mbtiDict)// 중간 점수
return self.setMBTI(resultDict: mbtiDict)
}
// 점수 계산
func getScore(survey : String, score: Int) ->(String,Int) {
if(score == 4){
return ("",0)
}else if(score < 4){
return (String(survey.first!),4-score)
}else{
return (String(survey.last!),score-4)
}
}
//MBTI 점수 비교후 MBTI 출력
func setMBTI(resultDict : [String : Int]) -> String{
let mbtiRT = resultDict["R"]!>=resultDict["T"]! ? "R":"T"
let mbtiCF = resultDict["C"]!>=resultDict["F"]! ? "C":"F"
let mbtiJM = resultDict["J"]!>=resultDict["M"]! ? "J":"M"
let mbtiAN = resultDict["A"]!>=resultDict["N"]! ? "A":"N"
return mbtiRT + mbtiCF + mbtiJM + mbtiAN
}
짠!
처음에는 효율이 떨어져서 100 점이 안나왔는데 4에대한 예외를 처리해주니까 100점으로 나오네요
MBTI 라는 소재가 워낙 친숙하기도 해서 문제가 비교적 쉽게 느껴지네요
꼭 swift 가 아니더라도 다른 언어로 연습해도 좋은 문제인 것 같네요.
연습하시는 분들에게 기본 문제로 추천드려요.
오늘도 파이팅입니다.
'iOS개발 > 프로그래머스 연습' 카테고리의 다른 글
프로그래머스 개인정보 수집 유효기간 (Lv.1) 문제풀이 (0) | 2023.09.18 |
---|---|
순열 과 중복 순열 만들기 (with swift) (0) | 2023.08.24 |
프로그래머스 이모티콘 할인행사 (Lv.2) 문제 풀이 (0) | 2023.08.18 |