알고리즘/이것저것

[프로그래머스] 2022 KAKAO TECH INTERNSHIP 성격 유형 검사하기 - 파이썬(python)

아뵹젼 2022. 9. 1.

 

 

 

나의 풀이

def solution(survey, choices):
    arr ={"R":0, "T":0,"C":0,"F":0,"J":0,"M":0,"A":0,"N":0}
    result = ""
    
    for i,j in zip(survey, choices) :
        if j < 4 :
            arr[i[0]] += (4 - j)
        elif j > 4 :
            arr[i[1]] += (j - 4)
            
    arr2 = list(arr.items())

    for i in range(0,len(arr2),2) :
        if arr2[i+1][1] > arr2[i][1] :
            result += arr2[i+1][0]
        else :
            result += arr2[i][0]

    return result

각 유형별 알파벳을 key 값으로 0을 value 로 초기화 하였다.

그리고 choices 원소들을 for문으로 돌면서 점수에 맞게 dict 에 점수를 추가해주었다.

점수가 4점 미만일 경우 AN 중 첫 번째 알파벳에 (4-점수) 를 부여한다.

점수가 4점 초과일 경우 AN 중 두 번째 알파벳에 (점수-4) 를 부여한다.

 

그런 다음, for문으로 방금 점수를 부여한 dict 리스트를 순회하면서 어떤 알파벳의 점수가 더 높은지 확인하면 된다.

나는 i를 0~7까지 2칸 씩 증가하면서 확인하였다.

R이 인덱스 0번, T가 인덱스 1번

C가 인덱스 2번, F가 인덱스 3번인 셈이다.

둘 중 점수가 큰 알파벳을 result 에 추가해주었다. 

 

 

 

로직은 쉽게 짰으나, 구현하는 데에 시간이 조금 걸렸다.

특히 엄청 멍청한 실수를 해서 시간을 많이 빼았겼다 ㅠㅠ

학생 때부터 가지고 있던 문제를 제대로 안 읽는 나쁜 습관이 아직도 남아있나 보다...

매우 비동의가 3점인데 매우 비동의를 1점으로 착각하여 몇 십분 째 끙끙됐다는...ㅎㅎ

 

 

다른 풀이

from collections import defaultdict

def solution(survey, choices):
    indicator = [('R', 'T'), ('C', 'F'), ('J', 'M'), ('A', 'N')]
    answer = ''
    personality = defaultdict(int)
    for s, c in zip(survey, choices):
        if c < 4:
            personality[s[0]] += (4 - c)
        elif c > 4:
            personality[s[1]] += (c - 4)
    for i in indicator:
        if personality[i[0]] >= personality[i[1]]:
            answer += i[0]
        else:
            answer += i[1]
    return answer

역시 나보다 깔끔하다...

defaultdict 를 사용한 것,

각 유형별 알파벳을 튜플 원소로 구성함으로써 그룹화로 인해 깔끔하고 직관적인 코드를 작성한 것.

나도 베스트 코드를 작성하는 그 날까지 더욱 노력해야겠다...ㅎ

댓글