https://school.programmers.co.kr/learn/courses/30/lessons/118666
나만의 카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.

검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.
각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.
예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 있습니다.

이때 검사자가 질문에서 약간 동의 선택지를 선택할 경우 어피치형(A) 성격 유형 1점을 받게 됩니다. 만약 검사자가 매우 비동의 선택지를 선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.
위 예시처럼 네오형이 비동의, 어피치형이 동의인 경우만 주어지지 않고, 질문에 따라 네오형이 동의, 어피치형이 비동의인 경우도 주어질 수 있습니다.
하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.
매우 동의나 매우 비동의 선택지를 선택하면 3점을 얻습니다.동의나 비동의 선택지를 선택하면 2점을 얻습니다.약간 동의나 약간 비동의 선택지를 선택하면 1점을 얻습니다.모르겠음 선택지를 선택하면 점수를 얻지 않습니다.검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.
질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.
문제가 너무 길어서 더이상 가져오는 건 패스! 링크에서 확인하자.
# RT CF JM AN
def solution(survey, choices):
answer = ''
dic = {'RT':0, 'CF':0, 'JM':0, 'AN':0} # 유형별 점수. 음수는 왼쪽결과, 양수는 오른쪽 결과 나타냄
for q, a in zip(survey,choices):
try : # 예를들어 질문이 RT일 때는 질문 순서가 바뀌지 않았으므로 계산 진행함.
if a-4 <0:
dic[q] -= abs(a-4) #`대답-4`가 음수면 비동의이므로 뺌.
else:
dic[q] += abs(a-4)
except : #예를들어 질문이 TR일때는 질문순서가 바뀌었으므로 RT로 바꿔 계산을 반대로 진행함.
if a-4 <0:
dic[q[1]+q[0]] += abs(a-4) #예를들어 TR일 때 `대답-4`가 음수면 T에대한 동의이므로 RT에서 더함.
else:
dic[q[1]+q[0]] -= abs(a-4)
for d, v in dic.items():
if v<=0 : #음수거나 0이면 왼쪽 문자 나타내기
answer += d[0]
else :
answer += d[1]
return answer
일단 짧고 가독성있게 작성하기위해 시간을 썼다.
주먹구구식으로 점수를 더하기보다는 딕셔너리를 활용하여 효울적으로 접근하고 싶었다.
dic = {'RT':0, 'CF':0, 'JM':0, 'AN':0} # 유형별 점수. 음수는 왼쪽결과, 양수는 오른쪽 결과 나타냄: 주석 그대로 해석하면 된다. 각 유형별 점수이다. 해당 문제가 MBTI검사와 흡사하여 MBTI를 검사하는 것처럼 구현하고 싶었다. 예를 들어 RT가 음수값이면 R에 치우친다.
for q, a in zip(survey,choices):: 질문과 답을 합쳤다. 질문에 대한 답을 검사할 것이다.
try : # 예를들어 질문이 RT일 때는 질문 순서가 바뀌지 않았으므로 계산 진행함.: 주석 그대로 해석하면 된다. 질문이 RT일때는 dic[RT]를 할 때 오류가 나지 않으므로 try에서 해결하도록 한다.
if a-4 <0: dic[q] -= abs(a-4) #`대답-4`가 음수면 비동의이므로 뺌. else: dic[q] += abs(a-4)
- 예를 들어
대답-4값이 음수면 왼쪽 질문에 대한 동의(즉, 비동의)이므로 딕셔너리에서 해당 유형에 대해 점수만큼 감소하도록 한다.- 양수일 땐 더하도록 한다.
except : #예를들어 질문이 TR일때는 질문순서가 바뀌었으므로 RT로 바꿔 계산을 반대로 진행함. if a-4 <0: dic[q[1]+q[0]] += abs(a-4) #예를들어 TR일 때 `대답-4`가 음수면 T에대한 동의이므로 RT에서 더함. else: dic[q[1]+q[0]] -= abs(a-4)
- 주석 그대로 해석하면 된다. 질문 순서가 바뀌었으므로 존재하지 않는 키값에 접근하여 오류가 나기 때문에 except에서 처리하도록 한다.
dic[q[1]+q[0]]: 질문 순서가 바뀌었으므로 두 알파벳을 교차하여 정상적으로 접근하도록 한다.
for d, v in dic.items(): if v<=0 : #음수거나 0이면 왼쪽 문자 나타내기 answer += d[0] else : answer += d[1]
- 딕셔너리에서 질문과 점수를 모두 가져와 점수의 음양값을 판단한다.
- 0이하이면 왼쪽 유형에 치우쳤으므로 앞의 알파벳을 추가한다.

냅다 코드를 작성하지 않고, 실제 MBTI 검사 로직은 어떻게 구상될까 생각하며 풀었다.
그나저나 레벨1 열심히 풀고있는데 맨 앞에 문제가 하나 생겼길래 뭐야 이건?! 했는데 알고보니 방금 추가된 문제...ㅎ 제출이 61개더라