카카오 성격 유형 검사지를 만드는데 아래와 같이 지표 번호와 성격 유형이 있다.
지표 번호 | 성격 유형 |
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 |
댓글