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개더라