카카오 LV.1 성격 유형 검사하기 문제를 풀어봤는데, 뭔가 어렵게 느껴진다면 어렵고
쉽게 느껴진다면 쉽게 느껴지는 문제였습니다. ??? 그게 무슨 말인교?
복잡해 보이지만 예시를 보면서 하나씩 이해하다 보니 풀리는 문제였습니다.
그렇지만 3시간 걸렸....ㄷ..ㅏ..ㅠ 그래도 풀었다는게 중요한거지!!
지문이 길기 때문에 설명하면서 중간에 필요한 부분을
캡쳐해서 보여드리겠습니다.
자 스타트~!
문제를 끝까지 읽었다면 가장 중요하게 생각하는 부분이
해당 지문이었습니다. 이 지문을 읽고 흠.. 그러니까
비동의 관련 선택지( 1 ~ 3 ) 를 선택하면 어피치형, 동의 관련 선택지 ( 5 ~ 7 ) 를 선택하면 네오형 의 점수를 얻음
choices에 따라 선택지에 해당하는 점수를 얻음
한 예시로
["AN"] , [5] 이면 약간 동의( 5 )에 해당한다.
이렇게 해서 만들어진 결과를 보면 "AN"일때 "R" : 점수 , "T": 점수, "C" : 점수 , "F": 점수, "J" : 점수 , "M", "A" : 점수 , "N": 점수 이렇게 설정되어 있는것을 볼 수있다.
자 그렇다면 일단 모든 "문자"에 대한 점수를 만들 수 있는 식을 써보자
// 해당 문자에 대한 점수를 적어줬습니다.
// 왜냐하면 비동의 ~ 매우 동의에 해당하는 선택지 선택시 해당 문자에 대한 점수를 올려주기 위함
var dic: [String:Int] = ["R": 0, "T": 0, "C": 0, "F": 0, "J": 0, "M": 0, "A":0, "N": 0]
이제 이 부분을 다시 보자
위에 한번 언급한
비동의 관련 선택지( 1 ~ 3 ) 를 선택하면 어피치형, 동의 관련 선택지 ( 5 ~ 7 ) 를 선택하면 네오형 의 점수를 얻음
이말을 뜻한다. 그렇다면 예시를 통해 어떻게 적용하는지 살펴보자
// ["AN"], [5] 일때 :
var dic: [String:Int] = ["R": 0, "T": 0, "C": 0, "F": 0, "J": 0, "M": 0, "A":0, "N": 0]
/*
A는 어피치형
N은 네오형
5이기 때문에 약간 동의 네오형에 + 1을 해준다. "N" : 1로 바뀐걸 확인 할 수 있다.
*/
var dic: [String:Int] = ["R": 0, "T": 0, "C": 0, "F": 0, "J": 0, "M": 0, "A":0, "N": 1]
5일때는 N을 올려줬기 때문에 5 ~ 7에 해당하면
"AN"의 끝자리 문자에 + 해주는 것을 확인할 수 있다.
그렇다면... 1 ~ 3에 해당하면 어떻게 되나요??
"AN"의 앞자리 문자에 +를 해준다.
아하... 그렇군 여기까지 이해가 됐으면 소리 질러 ~!!
흠... 이런식으로 진행하는 것이면... choices에서 for문을 통해 하나씩 뽑아서 비교하면 될거 같다.
var dic: [String:Int] = ["R": 0, "T": 0, "C": 0, "F": 0, "J": 0, "M": 0, "A":0, "N": 0]
// choices에서 하나씩 순서대로 뽑아오기 위해 for문 사용, / survey.count로 해도 괜찮음
for k in 0..<choices.count {
// ex) "AN"에서 앞자리 , 뒤자리 문자의 해당하는 dic을 올려주기 위해 변수 설정
let first = survey[k].first!
let last = survey[k].last!
}
자 그렇다면 choices[k]에 해당하는 요소가 무엇인지에 따라
first를 올려줄지, last를 올려줄지만 정하면 된다.
그 전에 이 지문을 보면 각 선택지에 대한 점수가 나와 있다 이것을 참고해서 만들어보자
var dic: [String:Int] = ["R": 0, "T": 0, "C": 0, "F": 0, "J": 0, "M": 0, "A":0, "N": 0]
// choices에서 하나씩 순서대로 뽑아오기 위해 for문 사용, / survey.count로 해도 괜찮음
for k in 0..<choices.count {
// ex) "AN"에서 앞자리 , 뒤자리 문자의 해당하는 dic을 올려주기 위해 변수 설정
let first = survey[k].first!
let last = survey[k].last!
// 해당 choices의 요소가 3인지 5인지에 따라 (앞 뒤) 문자의 점수를 올려줄 수있게 switch문으로 설정
switch choices[k] {
// 매우 비동의
case 1:
dic[String(first)]! += 3
// 비동의
case 2:
dic[String(first)]! += 2
// 약간 동의
case 3:
dic[String(first)]! += 1
// 모르겠음
case 4:
continue
// 약간 동의
case 5:
dic[String(last)]! += 1
// 동의
case 6:
dic[String(last)]! += 2
// 매우 동의
case 7:
dic[String(last)]! += 3
default:
break
}
}
print("dic for choices:",dic)
// survey: ["AN", "CF", "MJ", "RT", "NA"]
// choices : [5, 3, 2, 7, 5]
// dic for choices: ["F": 0, "J": 0, "T": 3, "M": 2, "N": 1, "C": 1, "R": 0, "A": 1]
음! 너무 좋고 깔끔하다 굿굿!
자 이제 다 왔다.
위의 지문에 따라 비교만 하면 된다.
var dic: [String:Int] = ["R": 0, "T": 0, "C": 0, "F": 0, "J": 0, "M": 0, "A":0, "N": 0]
// choices에서 하나씩 순서대로 뽑아오기 위해 for문 사용, / survey.count로 해도 괜찮음
for k in 0..<choices.count {
// ex) "AN"에서 앞자리 , 뒤자리 문자의 해당하는 dic을 올려주기 위해 변수 설정
let first = survey[k].first!
let last = survey[k].last!
// 해당 choices의 요소가 3인지 5인지에 따라 (앞 뒤) 문자의 점수를 올려줄 수있게 switch문으로 설정
switch choices[k] {
// 매우 비동의
case 1:
dic[String(first)]! += 3
// 비동의
case 2:
dic[String(first)]! += 2
// 약간 동의
case 3:
dic[String(first)]! += 1
// 모르겠음
case 4:
continue
// 약간 동의
case 5:
dic[String(last)]! += 1
// 동의
case 6:
dic[String(last)]! += 2
// 매우 동의
case 7:
dic[String(last)]! += 3
default:
break
}
}
print("dic for choices:",dic)
// 앞글자의 점수가 마지막 글자의 점수 보다 크면
if dic["R"]! >= dic["T"]! {
// 앞글자 추가
answer += "R"
} else {
// 아니라면 뒤글자 추가
answer += "T"
}
if dic["C"]! >= dic["F"]! {
answer += "C"
} else {
answer += "F"
}
if dic["J"]! >= dic["M"]! {
answer += "J"
} else {
answer += "M"
}
if dic["A"]! >= dic["N"]! {
answer += "A"
} else {
answer += "N"
}
print("answer:",answer)
// survey: ["AN", "CF", "MJ", "RT", "NA"]
// choices : [5, 3, 2, 7, 5]
// dic for choices: ["F": 0, "J": 0, "T": 3, "M": 2, "N": 1, "C": 1, "R": 0, "A": 1]
// answer: TCMA
최종 코드 입니다.
import Foundation
func solution(_ survey:[String], _ choices:[Int]) -> String {
// "RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA"
var dic: [String:Int] = ["R": 0, "T": 0, "C": 0, "F": 0, "J": 0, "M": 0, "A":0, "N": 0]
var answer = ""
print("Dic",dic)
// choices 에 대한 값이 들어왔을때 해당 dic에 숫자 더하기
for k in 0..<choices.count {
let first = survey[k].first!
let last = survey[k].last!
switch choices[k] {
case 1:
dic[String(first)]! += 3
case 2:
dic[String(first)]! += 2
case 3:
dic[String(first)]! += 1
case 4:
continue
case 5:
dic[String(last)]! += 1
case 6:
dic[String(last)]! += 2
case 7:
dic[String(last)]! += 3
default:
break
}
}
print("dic for choices:",dic)
if dic["R"]! >= dic["T"]! {
answer += "R"
} else {
answer += "T"
}
if dic["C"]! >= dic["F"]! {
answer += "C"
} else {
answer += "F"
}
if dic["J"]! >= dic["M"]! {
answer += "J"
} else {
answer += "M"
}
if dic["A"]! >= dic["N"]! {
answer += "A"
} else {
answer += "N"
}
print("answer:",answer)
return answer
}
let result = solution(["AN", "CF", "MJ", "RT", "NA"], [5, 3, 2, 7, 5])
print(result)
한줄 평 : 스텝 바이 스텝이다! 한 걸음씩 차근 차근 나아가자! 화이팅!
'알고리즘' 카테고리의 다른 글
프로그래머스 LV.1 개인정보 수집 유효기간 스위프트 (0) | 2023.05.22 |
---|---|
프로그래머스 LV.1 달리기 경주 스위프트 (0) | 2023.05.15 |
프로그래머스 LV.1 크레인 인형뽑기 게임 스위프트 (0) | 2023.05.09 |
프로그래머스 LV.1 옹알이(2) 스위프트 (0) | 2023.05.07 |
프로그래머스 LV.1 숫자 짝꿍 스위프트 (0) | 2023.05.05 |