https://school.programmers.co.kr/learn/courses/30/lessons/118666
from collections import defaultdict
def solution(survey, choices):
# 미리 값을 0으로 설정
score_dic = defaultdict(int)
# survey 조회하며 점수 더하기
for i in range(len(survey)):
one_survey = list(survey[i])
user_choice = choices[i]
# 0점일 경우 무시하기
if user_choice == 4:
continue
# 불만족 점수 더하기
elif user_choice > 0 and user_choice < 4:
tmp = one_survey[0]
score_dic[tmp] += getScore(user_choice)
# 만족 점수 더하기
elif user_choice > 4 and user_choice < 8:
tmp = one_survey[1]
score_dic[tmp] += getScore(user_choice)
first = find_one_mbti('R', 'T', score_dic)
second = find_one_mbti('C', 'F', score_dic)
third = find_one_mbti('J', 'M', score_dic)
fourth = find_one_mbti('A', 'N', score_dic)
return first + second + third + fourth
# 만족 불만족에 따른 점수 부여
def getScore(number):
if number == 1:
return 3
elif number == 2:
return 2
elif number == 3:
return 1
elif number == 4:
return 0
elif number == 5:
return 1
elif number == 6:
return 2
elif number == 7:
return 3
# mbti 하나 결정하기, 점수가 같으면 앞선 mbti 부여
def find_one_mbti(a, b, score_dict):
if score_dict[a] > score_dict[b]:
return a
elif score_dict[a] < score_dict[b]:
return b
else:
return a
의식의 흐름대로 생각한 것을 구현했더니 if-else를 남발하고, 하드코딩된 느낌이 강하다. mbti가 만약 4자리가 아닌 가변적이었다면 문제해결이 안됐을 것이다.
이번 문제를 풀면서 파이썬 문법때문에 고생했다.
AN 으로 들어올 경우 ['A', 'N'] list 를 만들고 싶어서 split() 을 사용해했는데, 안돼서 찾아보니 list('AN') 이라는 편리한 기능을 발견했다.
또한 defaultdict 의 편리한 기능 덕분에 미리 dict 에 0인 값들을 지정해서 활용할 수 있었다.