friends
: 친구의 이름 (2 ≤ len(friends)
≤ 50)
gifts
: 선물 주고 받은 정보 (1 ≤ len(gifts)
≤ 10,000)
A
: 선물 준 사람
B
: 선물 받은 사람
✅ 입력 조건
1. 친구 이름 저장된 리스트 입력
2.A B
형식으로gifts
정보 입력
✅ 출력 조건
1. 가장 많이 받아야 할 친구의 선물 개수 출력
총 2가지의 연산이 필요하다
1. 선물지수 연산
2. 받을 선물의 수 연산
각 연산의 결과를 저장하기 위해 1차원 리스트, 2차원 리스트를 정의한다.
for문을 통해 입력받은 gifts
와 주고 받은 결과를 저장하기 위해 정의한 gift_map
에 접근한다.
for문을 돌면서 선물 주고 받은 횟수, 선물지수를 한번에 계산해서 여러번 for문을 돌리는 것을 피한다.
친구들 각각의 받을 선물 수를 계산하기 위해 gift_map
을 접근해서 비교 연산을 진행한다.
최종적으로 최대 선물의 수를 구하기 위해 max()
연산으로 원하는 정답을 return한다.
선물 주고 받은 내역 저장 →
선물 주고 받은 횟수 계산 →
최대 선물 수 출력 →
최종 시간복잡도
가 되는데,
최악의 경우 이 된다.
for문으로 반복하며 선물 개수 계산
[원래 아이디어]
1. friends로 딕셔너리 만들어서 [0, 0, 0]으로 초기화
2. gifts에 접근해서 인덱스 0에 있는 사람의 딕셔너리의 인덱스 0에 +1, 인덱스 1에 있는 사람의 딕셔너리의 인덱스 1에 +1
3. 모두 계산 후 딕셔너리에 접근해 인덱스 2의 값을 선물지수 계산한 값으로 갱신
4. 딕셔너리에 접근해서 값 하나씩 비교하면서 받을 선물 수 계산하고 둘 중 큰 값으로 갱신
def solution(friends, gifts):
# 친구들 수 정의
n = len(friends)
# 받을 선물 수 저장할 리스트 초기화
answer = [0] * n
# 선물 주고 받은 내역 저장할 맵 정의
gift_map = [[0] * n for _ in range(n)]
# 선물지수 저장 변수 정의
gift_index = [0] * n
# 선물 주고 받은 횟수 계산
for gift in gifts:
# 주고 받은 사람 분리
A, B = gift.split()
# 인덱스 접근
give_idx, take_idx = friends.index(A), friends.index(B)
# 선물지수 계산
gift_index[give_idx] += 1
gift_index[take_idx] -= 1
# 주고 받은 횟수 저장
gift_map[give_idx][take_idx] += 1
# 맵에 접근해 받을 선물 계산
for i in range(n):
for j in range(i+1, n):
# i가 준 횟수가 더 많으면?
if gift_map[i][j] > gift_map[j][i]:
answer[i] += 1
# j가 준 횟수가 더 많으면?
elif gift_map[i][j] < gift_map[j][i]:
answer[j] += 1
# 횟수가 없거나 같다면? -> 선물지수 확인
else:
if gift_index[i] > gift_index[j]:
answer[i] += 1
elif gift_index[i] < gift_index[j]:
answer[j] += 1
# 받을 선물의 최댓값 출력
return(max(answer))