문제가 길기 때문에 접근법과 풀이과정에 대한 설명만 남깁니다.
코드
def solution(survey, choices):
n1, n2, n3, n4 = {'R':0, 'T':0}, {'C':0, 'F':0}, {'J':0, 'M':0}, {'A':0, 'N':0}
for i in range(len(survey)):
if survey[i] == 'RT' or survey[i] =='TR':
if choices[i] < 4: # 비동의 관련 선택지
n1[survey[i][0]] += 4 - choices[i]
elif choices[i] > 4: # 동의 관련 선택지
n1[survey[i][1]] += choices[i] - 4
if survey[i] == 'CF' or survey[i] =='FC':
if choices[i] < 4: # 비동의 관련 선택지
n2[survey[i][0]] += 4 - choices[i]
elif choices[i] > 4: # 동의 관련 선택지
n2[survey[i][1]] += choices[i] - 4
if survey[i] == 'JM' or survey[i] =='MJ':
if choices[i] < 4: # 비동의 관련 선택지
n3[survey[i][0]] += 4 - choices[i]
elif choices[i] > 4: # 동의 관련 선택지
n3[survey[i][1]] += choices[i] - 4
if survey[i] == 'AN' or survey[i] =='NA':
if choices[i] < 4: # 비동의 관련 선택지
n4[survey[i][0]] += 4 - choices[i]
elif choices[i] > 4: # 동의 관련 선택지
n4[survey[i][1]] += choices[i] - 4
answer = ''
answer += 'R' if n1['R'] >= n1['T'] else 'T'
answer += 'C' if n2['C'] >= n2['F'] else 'F'
answer += 'J' if n3['J'] >= n3['M'] else 'M'
answer += 'A' if n4['A'] >= n4['N'] else 'N'
return answer
4가지 유형에 대한 점수를 저장할 딕셔너리를 각각 만들어 주었다.
n1에는 RT, n2에는 CF, n3에는 JM, n4에는 AN에 대한 점수를 저장한다.
survey[i]의 문제 유형에 따라 if문 4가지를 만든 다음, 해당 문제에 대한 선택지의 값을 확인한다.
4보다 선택지 값이 작으면 비동의에 관련된 문제이고, 4보다 선택지 값이 크면 동의에 관련된 문제이다.
문제에서 survey[i]의 첫 번째 요소(=0번 인덱스)는 비동의 관련 선택지를 골랐을 경우의 성격 유형, 두 번째 요소(=1번 인덱스)는 동의 관련 선택지를 골랐을 경우의 성격 유형이라고 알려주었기 때문에 인덱스를 통해 접근한다.
선택지 값에 따라 비동의 문제 또는 동의 문제에 해당 값을 누적시켜 준다.
survey는 최대 1,000개가 가능하기 때문에 =이 아닌 +=를 통해 누적시켜줘야 한다.
이렇게 4가지 유형에 대해 모든 점수 계산이 완료되면 어떤 성격 유형을 가지고 있는지 반환해야 한다.
answer라는 문자열에 둘 중 큰 누적 값을 가지는 Key를 추가한다.
만약, R, T의 값이 같으면 사전순으로 반환해야 하므로 R 쪽에 등호를 붙여준다.
새로운 변수를 만들지 않고 반환하는 또 다른 방법이 있다.
return max(n1, key=n1.get)+max(n2, key=n2.get)+max(n3, key=n3.get)+max(n4, key=n4.get)
딕셔너리에서 최대 value를 가지는 key를 찾기 위해서는 max(dict, key=dict.get)를 사용할 수 있다.
이때, 최대 value를 가지는 key가 2개 이상이어도 딕셔너리에서 앞쪽에 위치하는 key를 리턴한다.
max를 사용하기 위해 처음 딕셔너리를 만들 때 TR 순이 아닌 RT 순으로 만들어 준 것이다.
따라서, max를 사용해 n1, n2, n3, n4에서 value가 큰 key를 찾아 + 연산자를 이용해 연결시켜 주면 구하고자 하는 답을 만들 수 있다.