본문 바로가기
알고리즘/프로그래머스

2022 KAKAO TECH INTERNSHIP - 성격 유형 검사하기 Python

by 개발자J의일상 2022. 9. 26.
반응형

카카오 성격 유형 검사지를 만드는데 아래와 같이 지표 번호성격 유형이 있다.

지표 번호 성격 유형
1번 지표 라이언형(R), 튜브형(T)
2번 지표 콘형(C), 프로도형(F)
3번 지표 제이지형(J), 무지형(M)
4번 지표 어피치형(A), 네오형(N)

만약에 survey에 'RT'가 있다면 choice 점수가 1점이면 R에 +3점, 7점이면 T에 +3점을 해주면 된다. 반대로 'TR'로 들어왔다면 choice 점수가 1점이면 T에 +3점, 7점이면 R에 +3점이다.

 

1번 문제부터 좀 복잡했던 것 같은 느낌이 든다. 아직 파이썬에 익숙하지 않아서 dictionarykey를 사용하면 될듯한데 실제로 구현이 떠오르지 않아 그냥 날 코딩으로 코드를 짰다. 아래 내용은 참고하면 될듯하다.

#1 RT
#2 CF
#3 JM
#4 AN
rows = 4
cols = 2

character = [[0 for j in range(cols)] for i in range(rows)]
def addChoices(index, left, right, choices):
    choices = int(choices)
    if (choices == 1) : character[index][left] += 3
    elif (choices == 2) :  character[index][left] += 2
    elif (choices == 3) : character[index][left] += 1
    elif (choices == 5) : character[index][right] += 1
    elif (choices == 6) : character[index][right] += 2
    elif (choices == 7) : character[index][right] += 3
    print("index = ", index)
    print("character[index][left] = ", character[index][left] )
    print("character[index][right] = ", character[index][right] )
def solution(survey, choices):
    choices_count = 0
    answer = ''
    for arr in survey:
        if arr == 'RT':
            addChoices(0, 0, 1, choices[choices_count])
        elif arr == 'TR':
            addChoices(0, 1, 0, choices[choices_count])
        elif arr == 'FC':
            addChoices(1, 1, 0, choices[choices_count])
        elif arr == 'CF':
            addChoices(1, 0, 1, choices[choices_count])
        elif arr == 'MJ':
            addChoices(2, 1, 0, choices[choices_count])
        elif arr == 'JM':
            addChoices(2, 0, 1, choices[choices_count])
        elif arr == 'AN':
            addChoices(3, 0, 1, choices[choices_count])
        elif arr == 'NA':
            addChoices(3, 1, 0, choices[choices_count])
        choices_count += 1

    for j in range(rows):
        for i in range(cols):
            print(character[j][i])


    if character[0][0] > character[0][1]:
        answer += 'R'
    elif character[0][1] > character[0][0]:
        answer += 'T'
    else: answer += 'R'

    if character[1][0] > character[1][1]:
        answer += 'C'
    elif character[1][1] > character[1][0]:
        answer += 'F'
    else: answer += 'C'

    if character[2][0] > character[2][1]:
        answer += 'J'
    elif character[2][1] > character[2][0]:
        answer += 'M'
    else: answer += 'J'

    if character[3][0] > character[3][1]:
        answer += 'A'
    elif character[3][1] > character[3][0]:
        answer += 'N'
    else: answer += 'A'

    print('answer = ', answer)
    return answer

 

내가 생각하기에 잘짠 코드를 가져와봤다. 위의 긴 코드가 깔끔하게 정리가 된 것을 볼 수 있다.

여기서 사용한 컨셉은 dictionaryzip이다.

 

dictionarykeyvalue로 이루어져있고 앞에가 key, 그리고 뒤에가 value이다.

key는 immutable, 즉 변경이 불가능하고 value는 mutable, 즉 변경이 가능하다.

d = {'abc' : 1, 'def' : 2}

아래와 같이 값에 접근이 가능하다!

d['abc']

 

zip은 쉽게 생각하면 for문에 여러개의 list의 값을 묶어서 접근할 수 있게 만들어 주는 것이다.

>>> numbers = [1, 2, 3]
>>> letters = ["A", "B", "C"]
>>> for pair in zip(numbers, letters):
...     print(pair)
...
(1, 'A')
(2, 'B')
(3, 'C')

원래 이중 포문을 돌리면 numbers의 1은 고정되어있고 letters의 "A", "B", "C"가 반복되고 numbers의 2로 변경이된다. 

numbers = [1, 2, 3]
letters = ["A", "B", "C"]
for num in numbers:
    for let in letters:
       print(num, let)
1 A
1 B
1 C
2 A
2 B
2 C
3 A
3 B
3 C

하지만 우리가 원하는 것은 numbers와 letters가 동시에 1씩 증가하는 것이다. 아래와 같이 하면 되긴 하지만 이 것은 range를 알고 있어야 한다. 물론 이것도 len(numbers)로 하면 되긴하지만 zip을 사용해보는 것도 좋을 것같다!

numbers = [1, 2, 3]
letters = ["A", "B", "C"]
for i in range(3):
    print(numbers[i], letters[i])
1 A
2 B
3 C

 

자세한 내용은 아래 글에 잘 정리가 되어있다!

dictionary : https://wikidocs.net/16043
zip : https://www.daleseo.com/python-zip/

 

다시 문제로 돌아와서 여기서 Key를 "RT", "CF", "JM", "AN"으로 설정하고 value를 0로 만들어준다.

물론 구현할 때 "TR", "FC", "MJ", "NA"도 설정 해도 되지만 여기서 이분이 아이디어를 낸 것은 바로

if A not in my_dict.keys()이다.

 

"TR"이 들어오면 A[::-1]을 하여 "RT"로 만들어 주고 choices의 값을 빼준다. 

B-4는 중간값은 0이기 때문에 4가 들어오면 어느쪽에도 점수가 없다!

아까 설명을 했지만 무조건 왼쪽에 값이 커지는 것인데 B가 1이라면 -3을 하게 되면서 -가 되면 왼쪽 값이 큰 것으로 처리를 하여 따로 R/T의 점수를 계산하지 않고 계산된 값을 동시에 가질 수 있게 되었다!

 

그래서 마지막 코드를 보면 my_dict[name] > 0 보다 크면 오른쪽에 있는 값이 큰 것이고 name[1]의 string을 result에 더해준다. 반대로 < 0 작은 경우는 왼쪽에 있는 값이 큰 것으로 name[0]의 string을 result에 더한다.

 

여기서 마지막으로 중요한 조건이 있었는데 점수가 0인경우 지표의 성격 유형은 사전순으로 빠른 값을 출력하는 조건이 있었다.

여기서 이분은 이 처리를 이름을 sorted함수를 사용하여 정렬하고 첫 번째 문자를 result에 더하여 처리하였다.

def solution(survey, choices):

    my_dict = {"RT":0,"CF":0,"JM":0,"AN":0}
    for A,B in zip(survey,choices):
        if A not in my_dict.keys():
            A = A[::-1]
            my_dict[A] -= B-4
        else:
            my_dict[A] += B-4

    result = ""
    for name in my_dict.keys():
        if my_dict[name] > 0:
            result += name[1]
        elif my_dict[name] < 0:
            result += name[0]
        else:
            result += sorted(name)[0]
    return result

 

이렇게 깔끔하게 문제를 풀어보았다.

인턴십인데도 1번 문제가 생각보다 생각할게 많고 까다로워서 놀랐다.

 

계속해서 2022 KAKAO TECH INTERNSHIP 문제를 풀고 리뷰를 해보려고한다.

300x250

댓글