📖Problem: [2022카카오테크인턴십] 성격유형 검사하기
- 작성일시: 2023년 9월 26일 오후 3:09
- site: 프로그래머스
- 등급: Level1
- 유형: 구현
🔍Institution
주어진 리스트 분석
choices
리스트
“매우”인 경우 3점, 비동의/동의인 경우 2점, “약간”이 들어가면 1점이다.
- 즉, 4를 기준으로 3,2,1점 1,2,3점이 나누어지게 된다.
- 즉, 4보다 작은지 큰지에 따라 다른 점수값을 넣어줘야 한다. 아래와 같이 정리할 수 있다.
choices[i]
< 4 라면 → 4 -choices[i]
choices[0]
이라면 4-1이므로 3점choices[1]
이라면 4-2이므로 2점choices[2]
이라면 4-3이므로 1점
choices[i]
> 4 라면 → choices[i] - 4choices[4]
라면 → 5-4이므로 1점choices[5]
라면 → 6-4이므로 2점choices[6]
이라면 → 7-4이므로 3점
survey
리스트
survey
원소는"RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA"
중 하나이며, 선택지 개수에 따라 원소가 달라질 수 있음
성격 유형 점수 계산하기
- 마지막에는 아래와 같이 성격 유형을 각 지표별로 계산해야 한다. 더 높은 값을 가진 유형으로 성격 유형이 결정되며, 값이 동일한 경우 알파벳 순으로 정해지게 된다.
- 이를 위해서 pairs리스트를 만들어 (R,T), (C,F), (J,M), (A,N)끼리 보며 값을 비교하는 반복문과 조건문을 사용한다.
🔍Approach
플로우
personality
딕셔너리를 만들어서 키 값으로는 성격유형 값(RTCFJMAN)이 들어가고, value값으로는 해당하는 key값에 대한 점수값이 들어가게 된다.pairs
리스트는 이후에 성격 유형별 점수를 비교할 때 지표별로 비교하기 위해 만든 리스트이다.
- 선택한
choices[i]
값이 기준값 4보다 큰지, 작은지를 판단한다.- 만약 4보다 작다면,
survey[i]
의 첫번째 캐릭터에 대한 점수로 계산 되어 해당하는 딕셔너리 키 값에 대한value
값으로 저장이 된다. (1,2,3인 경우 점수는 각각 3,2,1) - 만약 4보다 크다면,
survey[i]의
두번째 캐릭터에 대한 점수로 계산 되어 해당하는 딕셔너리 키 값에 대한value
값으로 저장이 된다 (5,6,7인 경우 점수는 각각 1,2,3)
- 만약 4보다 작다면,
- 각 지표별로 어떤 선택지의 값이 더 큰지 비교하기 위해
pairs
리스트와personality
딕셔너리를 함께 사용한다.pairs
리스트에서는 key값을 2개씩 반복하여 본다.personality
딕셔너리의 첫번째 키 값과 두번째 키 값을 비교하여 더 큰 값을answer
에 연결한다.pairs
리스트가 끝날 때까지 2개의 키 묶음씩 비교한다.
- 이 과정이 끝나면
answer
를 반환한다.
🚩My submission
def solution(survey, choices):
answer = ''
pairs = [('R', 'T'), ('C', 'F'), ('J', 'M'), ('A', 'N')]
personality = {'R':0, 'T':0, 'C':0, 'F':0, 'J':0, 'M':0, 'A':0, 'N':0}
for i in range(len(choices)):
if choices[i] < 4:
personality[survey[i][0]] += 4 - choices[i]
elif choices[i] > 4:
personality[survey[i][1]] += choices[i] - 4
for key1, key2 in pairs:
if personality[key1] >= personality[key2]:
answer += key1
else:
answer += key2
return answer
🚩Others submission
다른 사람들의 풀이 정보는 [프로그래머스/코딩테스트연습/성격유형검사하기/다른사람의 풀이]와 에서 확인하였습니다.
딕셔너리 없이 리스트로 풀이
def solution(survey, choices):
answer = ''
RTCFJMAN = [0,0,0,0,0,0,0,0]
str = "RTCFJMAN"
for i in range(len(survey)):
RTCFJMAN[str.index(survey[i][1])] += choices[i]-4
if(RTCFJMAN[0]>=RTCFJMAN[1]): answer+= "R"
else: answer+="T"
if(RTCFJMAN[2]>=RTCFJMAN[3]): answer+= "C"
else: answer+="F"
if(RTCFJMAN[4]>=RTCFJMAN[5]): answer+= "J"
else: answer+="M"
if(RTCFJMAN[6]>=RTCFJMAN[7]): answer+= "A"
else: answer+="N"
return answer
조건문 판단
1. 단순 if문
def solution(survey, choices):
scores = {"A":0, "N":0, "C":0, "F":0, "M":0, "J":0, "R":0, "T":0}
for idx, choice in enumerate(choices):
if choice - 4 > 0:
scores[survey[idx][1]] += choice - 4
elif choice - 4 < 0:
scores[survey[idx][0]] += 4 - choice
type = ""
if scores["R"] >= scores["T"]:
type += "R"
else:
type += "T"
if scores["C"] >= scores["F"]:
type += "C"
else:
type += "F"
if scores["J"] >= scores["M"]:
type += "J"
else:
type += "M"
if scores["A"] >= scores["N"]:
type += "A"
else:
type += "N"
return type
처음에 나도 이렇게 풀었는데 4번이나 비슷한 풀이 반복하여 조건문 쓰기 싫어서 pairs리스트를 추가했다.
2. 리스트로 비교 ([Programmers] 프로그래머스 Lv.1 성격 유형 검사하기 - 파이썬(Python), https://zu-techlog.tistory.com/93)
def solution(survey, choices):
types = {'R': 0, 'T': 0, 'C': 0, 'F': 0, 'J': 0, 'M': 0, 'A': 0, 'N': 0}
for i in range(len(choices)):
if choices[i] < 4:
types[survey[i][0]] += (choices[i] * 3) % 4
if choices[i] > 4:
types[survey[i][1]] += choices[i] % 4
type_key = list(types.keys())
answer = ''
for i in range(0, len(type_key), 2):
if types[type_key[i]] > types[type_key[i+1]]:
answer += type_key[i]
elif types[type_key[i]] < types[type_key[i+1]]:
answer += type_key[i+1]
else:
answer += min(type_key[i], type_key[i+1])
return answer
- 각 type들의 키값들을 리스트로 만들어서 loop를 돌며 비교한다. (알파벳비교는 사전 상 더 빠른(작은) 유형을 선택하도록 min함수를 활용하였다.
- 나와 풀이 개념은 비슷하지만 조금 더 깔끔한 것 같아 풀이를 참고하였다.
- 내 풀이는 처음에 주먹구구식으로 조건문을 만들었지만, 이를 2개씩 묶어 비교하면 좋겠다는 생각에 새로운 리스트를 만들어서 비교했다. 하지만 굳이 새로운 리스트를 만들 필요 없이, 딕셔너리에 순서대로 저장한 후 for문을 반복할 때 2개씩 보는 것이 더 효율적이고 배워가게 되었다.
2022 테크 여름인턴십 코딩테스트 해설 (힌트로 사용하기)
이 부분은 힌트로써 사용하면 좋을 것 같아서 첨부한다!
💡TIL
- 카카오 문제만 이해하면 쉬운데 문제를 이해하기까지 시간이 오래 걸리는 것 같다. 하지만 문제를 풀어보면 내용이 장황하나 이해만 한다면 금방 풀 수 있는 문제였다. 이런 문제가 카카오 문제에 꽤 있는 것 같다.
- 딕셔너리가 아닌 리스트로 하는 방법은 도저히 잘 생각이 떠오르지 않았는데 이번 기회에 배우게 되었다.
- 내가 푼 풀이 이외에 다른 사람의 풀이를 보며 많이 배워갔던 문제였다.
반응형