문제 보기 · 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단계 · 코드 흐름
  1. 여덟 유형의 점수를 0으로 둔 딕셔너리를 만든다.
  2. 질문마다 두 글자와 choice를 꺼내 3단계의 규칙대로 점수를 더한다.
  3. 지표 네 개마다 앞 글자 점수 ≥ 뒤 글자 점수면 앞 글자, 아니면 뒤 글자를 고른다.
  4. 고른 네 글자를 이어 붙여 돌려준다.
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”처럼 거꾸로 올 수 있다. 점수는 “어느 지표인가”가 아니라 “그 질문의 첫 글자인가 둘째 글자인가”로 준다.
  • 동점일 때 앞 글자를 고르려고 >=를 써야 한다. >를 쓰면 동점에서 뒤 글자가 나온다.
검증: 문제의 예시 2개를 통과했고, 무작위 입력 2,000개에서 1단계의 점수 표를 그대로 옮긴 다른 풀이(선택지마다 점수를 표에서 찾는 방식)와 결과가 같았다 — 04_pg118666_p1.py
  1. 프로그래머스 스쿨, “성격 유형 검사하기” (https://school.programmers.co.kr/learn/courses/30/lessons/118666), 2026-09-30 조회. ↩