이 험난한 세상에서어어~

[KAKAO, python] 성격 유형 검사하기 본문

algorithm/코딩 테스트

[KAKAO, python] 성격 유형 검사하기

토끼띠NJW 2023. 11. 24. 18:29

문제 설명

https://school.programmers.co.kr/learn/courses/30/lessons/118666

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

성격 유형 지표와 선택지 목록이 나오는데, 이 둘을 합쳐서 어떤 성격 유형인지를 파악하는 문제다. 만일 점수가 같다면 알파벳 순으로 나열한다.

 

성격유형에는 1번 지표 "RT", 2번 지표 "CF", 3번 지표 "JM", 4번 지표 "AN"이 있다. 참고로 성격 유형은 해당 지표를 순서대로 나열하니까 굳이 가능한 모든 지표 중에서 알바펫 순으로 먼저 나오는 것을 고를 필요가 없다. 알파벳 순서를 고려하는 것은 각 지표의 두 개의 유형 뿐이다.

 

문제는 프로그래머스에 잘 설명이 되어 있으니 읽어보면 될 것이다. 문제가 좀 길어서 걱정될 수 있는데, 프로그래머스에서 예시로 들어준 것을 차례대로 잘 따라가다보면 충분히 이해할 수 있을 것이다.

 

나도 문제가 길면 지례 겁을 먹는 성향이 있는데, 그래도 침착하게 종이와 팬을 들고 예시를 따라가 보자.

 

문제 풀이

survey는 설문이고 choices는 선택 점수이다. 설문에는 앞에 나온 지표가 비동의 족 뒤에 나온 지표가 동의 쪽이다.

그러므로 survey를 둘로 나눠서 만일 점수라 4보다 작다면 비동의로 4보다 크면 동의로 점수를 구해야 한다. 이때 비동의는 (4-점수) 동의는 (점수-4)로 성격 유형 점수로 맞춰주자.

 

그리고 딕셔너리 혹은 해시 맵을 활용해서 점수를 갱신해준다.

 

지문을 전부 갱신해서 점수를 만들어 줬으면 이제 각 지표에 따라서 결과를 구해야 한다. 나는 check이라는 함수를 따로 만들었는데, 점수 유형 지표가 4개 밖에 되지 않기에 일일이 넣어줬다. 그리고 각 지표를 떼서 점수를 확인한 후 점수가 높은 것을 answer에 붙여줬다. 만일 점수가 같으면 min을 활용해서 알파벳 순으로 더 앞에 나오는 것을 붙였다.

코드

from collections import defaultdict

survey = ["TR", "RT", "TR"] # 비동의 + 동의
choices = [7, 1, 3]
map = defaultdict(int)
map["R"] = 0
map["C"] = 0
map["J"] = 0
map["A"] = 0
map["T"] = 0
map["F"] = 0
map["M"] = 0
map["N"] = 0
answer = ""

def check(target):
    global answer
    a, b = list(target)
    a_score = map[a]
    b_score = map[b]
    if a_score > b_score:
        answer += a
    elif a_score < b_score:
        answer += b
    elif a_score == b_score:
        answer += min(a, b)

def solution(survey, choices):
    for i in range(len(choices)):
        n, y = list(survey[i])
        if choices[i] < 4:
            map[n] += (4-choices[i])
        elif 4 < choices[i] < 8:
            map[y] += (choices[i]-4)
    check("RT")
    check("CF")
    check("JM")
    check("AN")
    return answer