<로직 고민/>
- 문제 길이부터 기죽네...
- 일단 성격 유형을 리스트에 담는 게 좋을 것 같다
- 리스트 안에 튜플로
- 성격 유형 = [(R, T), (C, F), (J, M), (A, N)]
- 그러고 choices에 따라 각 자리에 점수를 더해주는거지.......?
- 그리고 점수표 딕셔너리가 필요할 듯
def solution(survey, choices):
answer = ''
types = {"R":0, "T":0, "C":0, "F":0, "J":0, "M":0, "A":0, "N":0}
score = {"first" : [1,2,3],
"second": [5,6,7]}
for s, c in zip(survey, choices):
print(s, c)
if c in score["first"]:
if c == 1:
types[s[0]] += 3
elif c == 2:
types[s[0]] += 2
else:
types[s[0]] += 1
elif c in score["second"]:
types[s[1]] += c - 4
print(list(types.values()))
for k1, k2, f, s in zip(list(types.keys())[::2], list(types.keys())[1::2], list(types.values())[::2], list(types.values())[1::2]):
print(k1, k2, f, s)
if f >= s:
answer += k1
else:
answer += k2
return answer
- 진짜 별의별 방법 다 동원하고 print문 찍어가면서 어렵게 풀었다...
- 일단 딕셔너리는 저렇게 성격 유형이랑 점수표를 만들었다
- 첫 번째 for문은 servey랑 choices를 묶어서 점수가 first 키 값에 있으면 survey의 앞자리를 키값으로 성격유형에서 찾아서 맞는 점수를 더해준다 second에 있을 때도 마찬가지
- 그렇게 for문이 다 돌고 나면 성격 유형 딕셔너리에 각 유형별로 점수가 매겨진다
- 이 점수들을 어떻게 비교해서 키값을 뽑아내야 할지 너무 막막했는데....
- zip이 최고다...
- 일단 zip으로 다 묶는데 키랑 밸류들을 list로 변환 후 2개씩 슬라이싱 해준다
- 그래서 밸류들끼리 비교한 후 해당하는 키를 answer에 넣어준다....
- 후 진짜 어렵게 풀었는데 3점 나왔다 ㅋㅋㅋㅋ
- 다른 사람들은 어떻게 풀었을까 ㅠㅠ
<완성된 풀이/>
def solution(survey, choices):
answer = ""
types = {"R": 0, "T": 0, "C": 0, "F": 0, "J": 0, "M": 0, "A": 0, "N": 0}
score = {"first": [1, 2, 3], "second": [5, 6, 7]}
for s, c in zip(survey, choices):
if c in score["first"]:
if c == 1:
types[s[0]] += 3
elif c == 2:
types[s[0]] += 2
else:
types[s[0]] += 1
elif c in score["second"]:
types[s[1]] += c - 4
for k1, k2, f, s in zip(
list(types.keys())[::2],
list(types.keys())[1::2],
list(types.values())[::2],
list(types.values())[1::2],
):
if f >= s:
answer += k1
else:
answer += k2
return answer
<다른 사람 풀이/>
- 다들 엄청 다양하게 풀었다 맘에 드는 풀이 하나만 가져와보겠다
- 천재풀이1
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
- 와 일단 survey를 딕셔너리로 만들고 없으면 바꿔버리고 값을 빼는 게 대박이다
- 있으면 그대로 두고 더해주고
- 그렇게 해서 값이 양수면 뒷글자, 음수면 앞글자, 0이면 오름차순 정렬해서 앞글자
- 와 이렇게 간단하게 가능하다니...!!
- 진짜 멋진 풀이다....
- 천재풀이2
- 하나만 리뷰하려고 했는데 처음에 내가 생각했던 대로 유형을 리스트 안에 튜플로 담은 풀이가 있길래 가져왔다
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 함수는 딕셔너리를 초기화해주는 함수인데, personality = defaultdict(int) 이렇게 했다는 건 내가 types 딕셔너리를 만든 것처럼 해주는 거다. 근데 미리 나처럼 만들 거 없이 defaultdict(int)를 해주면 딕셔너리에 없는 key를 호출했을 때 그 value가 0으로 초기화 돼서 출력된다(또 이렇게 새로운 거 배우는군..!)
- 그리고 점수가 1,2,3일 때 나처럼 if문 돌릴 거 없이 그냥 4에서 빼면 되는 거였다....이런....OTL 이렇게 바보같을 수가..
- 와우 그리고 난 성격 유형을 리스트에 튜플로 담을 생각까지만 하고 어떻게 활용할지는 나중에 생각하자..! 하고 진행했었는데 이렇게 하면 되는구나....~
- 아니 나도 이렇게 활용하려고 리스트에 튜플로 담을 생각한 거 맞을걸??? 그럴걸????
- 아니 그리고 이제 보니까 나처럼 score 딕셔너리 만들 필요없이 그냥 점수를 4를 기준으로 나누면 되는 거였네??? 내가 왜 3점이 나왔는지 알겠다 진짜 꾸역꾸역 어렵게 풀었어,,,,,;;;;;
- 이 문제 재밌네...
<수정/>
- 천재풀이2에 감명 받아서 내 비효율적인 코드를 조금 수정해봤다
def solution2(survey, choices):
answer = ""
types = types = {"R": 0, "T": 0, "C": 0, "F": 0, "J": 0, "M": 0, "A": 0, "N": 0}
for s, c in zip(survey, choices):
if c < 4:
types[s[0]] += 4 - c
elif c > 4:
types[s[1]] += c - 4
for k1, k2, f, s in zip(
list(types.keys())[::2],
list(types.keys())[1::2],
list(types.values())[::2],
list(types.values())[1::2],
):
if f >= s:
answer += k1
else:
answer += k2
return answer
- defaultdict 함수도 활용해 보고 싶은데 그럼 대대적인 수정이 필요하고 그럼 걍 천재풀이2와 다를 게 없어서 그냥...쓸데없는 if문이랑 score 딕셔너리를 지웠다 ㅋㅋㅋ
- 오 확실히 실행 시간은 단축됐군!! 굿~