티스토리 뷰

https://school.programmers.co.kr/learn/courses/30/lessons/118666?language=swift 

 

프로그래머스

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

programmers.co.kr

안녕하세요. 

간만에 프로그래머스에서 재밌는 문제를 발견해서 같이 풀이해볼까 합니다. 

유형이 좀 지나긴 했으나 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 가 아니더라도 다른 언어로 연습해도 좋은 문제인 것 같네요.

연습하시는 분들에게 기본 문제로 추천드려요.

 

오늘도 파이팅입니다.

댓글