본문 바로가기
  • Hi Hello, Code
🧑‍💻Problem Solutions/Programmers

[2022카카오테크인턴십] 성격유형 검사하기 (Python / 파이썬)

by 밍구링구링 2023. 10. 9.

📖Problem: [2022카카오테크인턴십] 성격유형 검사하기

 

프로그래머스

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

programmers.co.kr

  • 작성일시: 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] - 4
    • choices[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)
  • 각 지표별로 어떤 선택지의 값이 더 큰지 비교하기 위해 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 테크 여름인턴십 코딩테스트 해설 (힌트로 사용하기)

 

2022 테크 여름인턴십 코딩테스트 해설

2022년 카카오 여름 인턴십 코딩 테스트가 지난 5월 7일에 5시간에 걸쳐 진행되었습니다. 시간이 부족하여 문제를 풀지 못하는 아쉬움이 없도록 1시간을 늘려 테스트를 진행한 것이 작년과 조금

tech.kakao.com

이 부분은 힌트로써 사용하면 좋을 것 같아서 첨부한다!

💡TIL

  • 카카오 문제만 이해하면 쉬운데 문제를 이해하기까지 시간이 오래 걸리는 것 같다. 하지만 문제를 풀어보면 내용이 장황하나 이해만 한다면 금방 풀 수 있는 문제였다. 이런 문제가 카카오 문제에 꽤 있는 것 같다.
  • 딕셔너리가 아닌 리스트로 하는 방법은 도저히 잘 생각이 떠오르지 않았는데 이번 기회에 배우게 되었다.
  • 내가 푼 풀이 이외에 다른 사람의 풀이를 보며 많이 배워갔던 문제였다.
반응형