성격 유형 검사하기 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""성격 유형 검사하기 (프로그래머스 118666) 풀이와 검증."""
import random


def solution(survey, choices):
    score = {t: 0 for t in "RTCFJMAN"}
    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"]:
        answer += a if score[a] >= score[b] else b
    return answer


def by_table(survey, choices):
    """1단계의 점수 표를 그대로 옮긴 풀이."""
    side = {1: 0, 2: 0, 3: 0, 4: None, 5: 1, 6: 1, 7: 1}
    pts = {1: 3, 2: 2, 3: 1, 4: 0, 5: 1, 6: 2, 7: 3}
    score = {}
    for s, c in zip(survey, choices):
        if side[c] is not None:
            t = s[side[c]]
            score[t] = score.get(t, 0) + pts[c]
    out = []
    for pair in ["RT", "CF", "JM", "AN"]:
        x, y = sorted(pair)
        out.append(x if score.get(x, 0) >= score.get(y, 0) else y)
    return "".join(out)


if __name__ == "__main__":
    assert solution(["AN", "CF", "MJ", "RT", "NA"], [5, 3, 2, 7, 5]) == "TCMA"
    assert solution(["TR", "RT", "TR"], [7, 1, 3]) == "RCJA"
    assert solution(["RT", "NA"], [7, 2]) == "TCJN"
    rng = random.Random(118666)
    kinds = ["RT", "TR", "FC", "CF", "MJ", "JM", "AN", "NA"]
    for _ in range(2000):
        n = rng.randint(1, 30)
        sv = [rng.choice(kinds) for _ in range(n)]
        ch = [rng.randint(1, 7) for _ in range(n)]
        assert solution(sv, ch) == by_table(sv, ch)
    print("ALL CHECKS PASSED")