카카오 성격 유형 검사지를 만드는데 아래와 같이 지표 번호와 성격 유형이 있다.
지표 번호 | 성격 유형 |
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번 문제부터 좀 복잡했던 것 같은 느낌이 든다. 아직 파이썬에 익숙하지 않아서 dictionary와 key를 사용하면 될듯한데 실제로 구현이 떠오르지 않아 그냥 날 코딩으로 코드를 짰다. 아래 내용은 참고하면 될듯하다.
#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
내가 생각하기에 잘짠 코드를 가져와봤다. 위의 긴 코드가 깔끔하게 정리가 된 것을 볼 수 있다.
여기서 사용한 컨셉은 dictionary와 zip이다.
dictionary는 key와 value로 이루어져있고 앞에가 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 문제를 풀고 리뷰를 해보려고한다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 2020년 카카오 인턴십 키패드 누르기 Level1 (1) | 2022.06.24 |
---|---|
프로그래머스 스킬 체크 테스트 Level 1 C++ 쉬운 풀이 (0) | 2021.03.27 |
댓글