[프로그래머스] 성격 유형 검사하기 - python

iamjinseo·2022년 8월 18일
0

문제풀이-Python

목록 보기
59/134

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

profile
일단 뭐라도 해보는 중

0개의 댓글