https://school.programmers.co.kr/learn/courses/30/lessons/258712
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
처음에는 딕셔너리를 만들어 선물을 준 사람과 받은 사람관의 관계를 나타내고, 각 사람의 [준 선물/ 받은 선물 / 선물 지수]를 저장할 딕셔너리를 생성했다.
이후 서로간의 관계에 따라 다음달에 받을 선물을 확인하는 로직을 작성하던 중, 내가 받았을 때와 받지 않았을 때의 관계를 찾는것이 너무 어려웠다.
def solution(friends, gifts):
answer = {x:0 for x in friends}
gifts_to_friends = {x:{} for x in friends}
gifts_count = {x:[0,0,0] for x in friends}
for i in gifts:
give, take = i.split()
gifts_count[take][1] += 1 # 받은 선물 카운팅
if take in gifts_to_friends[give]:
gifts_to_friends[give][take] += 1 # 선물 전달 내역 기록
gifts_count[give][0] += 1 # 준 선물 카운팅
else:
gifts_to_friends[give][take] = 1
gifts_count[give][0] += 1
for name in gifts_count: #선물 지수 구하기
gifts_count[name][2] = gifts_count[name][0] - gifts_count[name][1]
print(gifts_to_friends)
print(gifts_count)
for giving_name in gifts_to_friends:
for friend in friends:
if giving_name != friend: #자신인 경우 제외
if gifts_to_friends[giving_name]: # 내가 선물을 준 사람이 있다면
for taking_name in gifts_to_friends[giving_name]: #여기까지는 ok
if giving_name in gifts_to_friends[taking_name]: #상대도 나에게 주었다면
if gifts_to_friends[giving_name][taking_name] > gifts_to_friends[taking_name][giving_name]:
answer[giving_name]+=1
elif gifts_to_friends[giving_name][taking_name] == gifts_to_friends[taking_name][giving_name]:
if gifts_count[giving_name][2] > gifts_count[taking_name][2]:
answer[giving_name]+=1
return max(answer.values())
나는 자신인 경우를 제외하였지만, 또 다시 어떤 관계에 대해 계산하는 문제가 있었다.
이 문제는 enumerate를 활용해 index 슬라이싱을 활용해 해결하였다.
관계가 없는 상황을 계산하는 것이 어려웠다. 이 문제는 딕셔너리 메서드 중 .get()메서드를 통해 해결했다.
.get() 메서드는 키를 지정해주고 그 키에대한 값이 있다면 반환해주고, 없다면 특정 값을 지정해 반환할 수 있다.
def solution(friends, gifts):
answer = {x:0 for x in friends}
gifts_to_friends = {x:{} for x in friends}
gifts_count = {x:[0,0,0] for x in friends}
for i in gifts:
give, take = i.split()
gifts_count[take][1] += 1 # 받은 선물 카운팅
if take in gifts_to_friends[give]:
gifts_to_friends[give][take] += 1 # 선물 전달 내역 기록
else:
gifts_to_friends[give][take] = 1
gifts_count[give][0] += 1 # 준 선물 카운팅
for name in gifts_count: #선물 지수 구하기
gifts_count[name][2] = gifts_count[name][0] - gifts_count[name][1]
# print(gifts_to_friends)
# print(gifts_count)
for i, giving_name in enumerate(friends):
for j, taking_name in enumerate(friends[i+1:], i+1): # 나를 제외 / 이전에 확인한 것은 제외
if giving_name != taking_name:
give_count = gifts_to_friends[giving_name].get(taking_name, 0) # .get()메서드 / 딕셔너리에서 해당 키의 값이 있다면 반환, 없다면 반환할 값을 지정 가능
take_count = gifts_to_friends[taking_name].get(giving_name, 0)
if give_count > take_count:
answer[giving_name] += 1
elif give_count < take_count:
answer[taking_name] += 1
else: # 선물을 주고받은 기록이 없거나 수가 같은 경우
if gifts_count[giving_name][2] > gifts_count[taking_name][2]:
answer[giving_name] += 1
elif gifts_count[giving_name][2] < gifts_count[taking_name][2]:
answer[taking_name] += 1
return max(answer.values())
이렇게 해당 문제를 풀이했다.
'<코딩테스트> > [프로그래머스]' 카테고리의 다른 글
[프로그래머스] > PCCP 기출문제 2번 > 퍼즐 게임 챌린지 (0) | 2024.12.29 |
---|---|
[프로그래머스] 코딩테스트 연습 Lv2> 연습문제 > 롤케이크 자르기 (0) | 2024.11.03 |
[프로그래머스] > 코딩테스트 연습2023 > KAKAO BLIND RECRUITMENT > 이모티콘 할인행사 (3) | 2024.10.20 |
[프로그래머스] > LV.2 > 타겟넘버 (0) | 2024.10.20 |
[프로그래머스] LV2 > 연습문제 > 뒤에 있는 큰 수 찾기 (0) | 2024.09.23 |