문제 보기 · Level 1 · 2022 KAKAO TECH INTERNSHIP · 정답률 55% · 푼 사람 28,316명 (2026-09-30 기준)1
문제
지표 4개(RT, CF, JM, AN)로 성격 유형을 정한다. 질문마다 survey[i]는 두 글자다. 비동의 쪽을 고르면 첫 글자 유형이, 동의 쪽을 고르면 둘째 글자 유형이 점수를 받는다. choices는 1~7이고 4가 ‘모르겠음’이다. 4에서 한 칸 멀어질 때마다 1점씩 늘어 최대 3점이다. 지표마다 점수가 높은 유형을 골라 네 글자로 돌려준다.
- 질문 1~1,000개
- 한 지표에서 두 유형의 점수가 같으면 사전순으로 앞선 유형을 고른다
풀이
막히면 한 단계씩 펼친다.
필요한 개념
딕셔너리와 집합: 유형 글자(R, T, …)를 키로 점수를 모으는 표.
1단계 · 작은 예로 손으로 풀기
선택지와 점수의 관계를 먼저 표로 만든다.
| choice | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 점수를 받는 쪽 | 첫 글자 | 첫 글자 | 첫 글자 | 없음 | 둘째 글자 | 둘째 글자 | 둘째 글자 |
| 점수 | 3 | 2 | 1 | 0 | 1 | 2 | 3 |
질문 두 개로 해 본다: (“RT”, 7), (“NA”, 2)
- “RT”에 7 → 둘째 글자 T가 3점
- “NA”에 2 → 첫 글자 N이 2점
- 점수: R 0, T 3 / C 0, F 0 / J 0, M 0 / A 0, N 2
- 지표마다 고르기: T (3 > 0), C (같으면 사전순 앞), J (같음), N (2 > 0) → “TCJN”
2단계 · 가장 단순한 방법과 그 속도
질문을 한 번 훑으며 점수를 더하면 된다. 질문이 최대 1,000개라 금방이다. 이 문제의 어려움은 속도가 아니라 규칙을 틀리지 않게 옮기는 것이다.
3단계 · 핵심 아이디어
1단계 표를 식 하나로 줄인다.
- choice < 4면 첫 글자가
4 - choice점을 받는다. (1 → 3점, 3 → 1점) - choice > 4면 둘째 글자가
choice - 4점을 받는다. (5 → 1점, 7 → 3점)
점수는 유형 글자를 키로 하는 딕셔너리에 모은다. 지표 네 개를 (“R”, “T”), (“C”, “F”), (“J”, “M”), (“A”, “N”)처럼 사전순으로 앞선 글자를 먼저 적어 두면, “같으면 앞 글자”를 >= 비교 하나로 처리할 수 있다.
4단계 · 코드 흐름
- 여덟 유형의 점수를 0으로 둔 딕셔너리를 만든다.
- 질문마다 두 글자와 choice를 꺼내 3단계의 규칙대로 점수를 더한다.
- 지표 네 개마다 앞 글자 점수 ≥ 뒤 글자 점수면 앞 글자, 아니면 뒤 글자를 고른다.
- 고른 네 글자를 이어 붙여 돌려준다.
5단계 · 파이썬 코드
def solution(survey, choices):
score = {t: 0 for t in "RTCFJMAN"} # 여덟 유형 모두 0점에서 시작
for s, c in zip(survey, choices): # 질문과 선택을 나란히 꺼낸다
if c < 4:
score[s[0]] += 4 - c # 비동의 쪽: 첫 글자
elif c > 4:
score[s[1]] += c - 4 # 동의 쪽: 둘째 글자
answer = ""
for a, b in ["RT", "CF", "JM", "AN"]: # "RT"는 a="R", b="T"로 나뉜다
answer += a if score[a] >= score[b] else b
return answer
{t: 0 for t in "RTCFJMAN"}: 딕셔너리 컴프리헨션이다. 글자마다글자: 0을 넣는다.zip(survey, choices): 두 리스트에서 같은 번호끼리 짝지어 꺼낸다.for a, b in ["RT", ...]: 두 글자 문자열도 두 이름에 나눠 담을 수 있다.- c가 4면
if도elif도 아니라 아무 일도 하지 않는다.
6단계 · 실행 추적
survey = [“AN”, “CF”, “MJ”, “RT”, “NA”], choices = [5, 3, 2, 7, 5]
| 질문 | choice | 받는 유형 | 점수 |
|---|---|---|---|
| AN | 5 | 둘째 N | +1 |
| CF | 3 | 첫째 C | +1 |
| MJ | 2 | 첫째 M | +2 |
| RT | 7 | 둘째 T | +3 |
| NA | 5 | 둘째 A | +1 |
점수: R 0, T 3 / C 1, F 0 / J 0, M 2 / A 1, N 1
고르기: T, C, M, A(1 = 1이라 앞 글자) → “TCMA”
7단계 · 복잡도와 흔한 실수
질문을 한 번 훑으니 \(O(n)\)이다.
- survey가 “NA”처럼 거꾸로 올 수 있다. 점수는 “어느 지표인가”가 아니라 “그 질문의 첫 글자인가 둘째 글자인가”로 준다.
- 동점일 때 앞 글자를 고르려고
>=를 써야 한다.>를 쓰면 동점에서 뒤 글자가 나온다.
-
프로그래머스 스쿨, “성격 유형 검사하기” (https://school.programmers.co.kr/learn/courses/30/lessons/118666), 2026-09-30 조회. ↩