[문제]
나만의 카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.
지표 번호 | 성격 유형 |
1번 지표 | 라이언형(R), 튜브형(T) |
2번 지표 | 콘형(C), 프로도형(F) |
3번 지표 | 제이지형(J), 무지형(M) |
4번 지표 | 어피치형(A), 네오형(N) |
4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, "RFMN"이나 "TCMA"와 같은 성격 유형이 있습니다.
검사지에는 총 n개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.
- 매우 비동의
- 비동의
- 약간 비동의
- 모르겠음
- 약간 동의
- 동의
- 매우 동의
각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.
예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 있습니다.
선택지 | 성격 유형 점수 |
매우 비동의 | 네오형 3점 |
비동의 | 네오형 2점 |
약간 비동의 | 네오형 1점 |
모르겠음 | 어떤 성격 유형도 점수를 얻지 않습니다 |
약간 동의 | 어피치형 1점 |
동의 | 어피치형 2점 |
매우 동의 | 어피치형 3점 |
이때 검사자가 질문에서 약간 동의 선택지를 선택할 경우 어피치형(A) 성격 유형 1점을 받게 됩니다. 만약 검사자가 매우 비동의 선택지를 선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.
위 예시처럼 네오형이 비동의, 어피치형이 동의인 경우만 주어지지 않고, 질문에 따라 네오형이 동의, 어피치형이 비동의인 경우도 주어질 수 있습니다.
하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.
- 매우 동의나 매우 비동의 선택지를 선택하면 3점을 얻습니다.
- 동의나 비동의 선택지를 선택하면 2점을 얻습니다.
- 약간 동의나 약간 비동의 선택지를 선택하면 1점을 얻습니다.
- 모르겠음 선택지를 선택하면 점수를 얻지 않습니다.
검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.
질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요.
[입출력 예시] survey = ["TR", "RT", "TR"] , choices = [7, 1, 3] 가 입력 되었을 때
https://school.programmers.co.kr/learn/courses/30/lessons/70129
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
🎨 풀이
💡 전체 코드
def solution(survey, choices):
answer = ""
score = {1:3,2:2,3:1,4:0,5:1,6:2,7:3}
kakao = {'R':0,'T':0,'C':0,'F':0,'J':0,'M':0,'A':0,'N':0}
kind = ['RT','CF','JM','AN']
for i in range(len(choices)):
tmp = choices[i]
if tmp < 4 :
kakao[survey[i][0]] += score[tmp]
elif 4 < tmp :
kakao[survey[i][1]] += score[tmp]
for i in range(len(kind)):
if kakao[kind[i][0]] > kakao[kind[i][1]]:
answer += kind[i][0]
elif kakao[kind[i][0]] < kakao[kind[i][1]]:
answer += kind[i][1]
else :
answer += kind[i][0]
return answer
> 핵심 : 딕셔너리 이용!
🍦 코드 설명 (실행 순서대로 나열)
#solution
answer = ""
score = {1:3,2:2,3:1,4:0,5:1,6:2,7:3}
kakao = {'R':0,'T':0,'C':0,'F':0,'J':0,'M':0,'A':0,'N':0}
kind = ['RT','CF','JM','AN']
1. 변수와 딕셔너리를 초기화한다.
- answer : 결과
- score : 선택지에 따른 점수
- 매우 비동의인 1을 선택한다면 한 쪽에 3점을 줘야하니까 이 작업을 간편하게 만들기 위해 딕셔너리 사용
- kakao : 검사자 유형 점수 현황
- 검사자가 고른 선택지에 따라 해당 점수가 변경될 예정
- kind : 4개 지표를 묶어서 둔 리스트
- 마지막에 검사자의 성격 유형 통계내기 위해 필요함.
- 점수가 같을 경우를 대비해 미리 사전순으로 써줬음.
#solution - ① 선택지 보고 검사자 유형 점수 바꿔주기!
for i in range(len(choices)):
tmp = choices[i]
if tmp < 4 :
kakao[survey[i][0]] += score[tmp]
elif 4 < tmp :
kakao[survey[i][1]] += score[tmp]
2. tmp에 choices[i] 값을 넣는다.
- 코드를 간단하게 만들기 위해 tmp에 넣고 시작했다.
3. 만약 tmp 값이 4보다 작다면, kakao[survey[i][0]]에 score[tmp] 값을 더해준다.
- (ex) survey = "TR", tmp = 3 라면, kakao['T'] += score[3] 를 하라는 코드다.
결과 : kakao['T'] += 1 => kakao{'R':0, 'T':1, 'C':0, ... , 'N':0}
4. 만약 tmp 값이 4보다 크다면, kakao[survey[i][1]]에 score[tmp] 값을 더해준다.
- 방식은 위와 같다.
- 여기서는 kakao[survey[i][1]]에 값을 더해주는 것이 다르다.
#solution - ② 결과 내기
for i in range(len(kind)):
if kakao[kind[i][0]] > kakao[kind[i][1]]:
answer += kind[i][0]
elif kakao[kind[i][0]] < kakao[kind[i][1]]:
answer += kind[i][1]
else :
answer += kind[i][0]
return answer
5. kind 리스트의 길이만큼 for문을 돌린다. (4번)
6. kind[i][0]의 점수가 kind[i][1]의 점수보다 더 크다면, answer에 kind[i][0]을 더해준다.
- (ex) kakao[kind[i][0]] => kakao['R'] => R 점수 (숫자)
7. kind[i][0]의 점수가 kind[i][1]의 점수보다 더 작다면, answer에 kind[i][1]을 더해준다.
8. 점수가 같다면, answer에 kind[i][0]을 더해준다.
- kind에 미리 사전순으로 써두었기 때문

끝~
⭐ 느낀점
> 이 문제 딱 떠있는 거 보고 풀어보고 싶다는 생각을 1달 전부터 했던 것 같은데~~! 풀게 되어서 재밌었고 한번에 딱 통과해서 기분이 두 배로 좋았따. ㅎㅎ 약간 mbti 느낌이라서 더 재미 있었던 것 같다. 내가 알고리즘 문제를 풀면서 재밌다는 생각을 하다니,, 나는 프로그래머스랑 조금 더 잘 맞나부다. 헤헹 잘 풀었다~ 고생했다! 아 그리고 마지막에 점수 결과에 따라 알파벳 더해줄 때 if문 덜 쓸 수 있겠더라. 문제 풀이 쓰다가 그걸 깨달았다~~~ 굿이다 굿~~
'🎲 알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / Level 2] 올바른 괄호 (파이썬) (0) | 2022.09.17 |
---|---|
[프로그래머스 / Level 1] 크레인 인형뽑기 게임 (파이썬) (0) | 2022.09.16 |
[프로그래머스 / Level 2] 이진 변환 반복하기 (파이썬) (0) | 2022.09.14 |
[DAY 103 - 프로그래머스 / Level 2] k진수에서 소수 개수 구하기 (파이썬) (0) | 2022.07.03 |
[프로그래머스 / Level 1] 정수 제곱근 판별 (파이썬) (0) | 2022.05.14 |