25.03.27, TIL07–
와 비오고 흐리다 너무 신난다
25.03.27, TIL 08
와 비오고 흐리다 너무 신난다

게로게로ㅔㄱ로
오늘도 화이팅!
밀려있던 알고리즘 코드 카타를 풀어보자

//제공된 코드
import Foundation
func solution(_ friends: [String], _gifts: [String]) -> Int {
return 0
}
….

…
뭐라는지 모르겠다
그치만
그래도 해야지 어떡해 헤헤..
먼저 해결해야하는 것은
- 친구들이 주고 받은 선물 데이터를 효율적으로 저장해야 하고
- 각 친구 별 선물 보낸 개수, 받은 개수 계산해야 하고
- 친구들끼리 비교하며 누가 선물을 받을지 결정해야 하고
- 선물을 가장 많이 받은 친구의 선물 개수를 출력해야 함
STEP 1. 딕셔너리 초기화
giftCount : [String:[String: Int]]
-> 어떤 친구가 다른 친구에게 몇개의 선물을 저장하기 위해
giftScore : [String: Int]
-> 각 친구의 선물 지수 집계
nextGifts :[String: Int]
-> 다음 달에 받을 선물 개수 저장
import Foundation
func sloution(_ friends: [String], _ gifts: [String]) -> Int {
var giftCount: [String: [String: int]] = [:] // 주고받은 선물 기록
var giftScore: [String: Int] = [:] // 선물 지수 저장
var nextGifts: [String: Int] = [:] //다음 달 받을 선물 저장
그리고 배당될 친구들도 초기값 설정
for friend in friends {
giftCount[friend] = [:]
giftScore[friend] = 0
nextGifts[friend] = 0
}
//친구들을 딕셔너리에 등록하고 초기값 설정
- 선물 교환 기록 저장
giftCount에다가 각 친구가 누구에게 몇 개를 줬는지 그 기록을 저장하기
for gift in gifts {
let parts = gist.split(separpator: " ").map { String($0) }
let sender = parts[0]
let receiver = parts[1]
giftCount[sender]![receiver, default: 0] += 1
}
- 선물 지수 집계
for sender in friends {
var sent = 0
var received = 0
for reciever in friends {
sennt += giftCount[sender]?[receiver] ?? 0
received += giftCount[receiver]?[sender] ?? 0
}
giftScore[ssneder] = sent - received
}
//giftScore = 보낸 개수 - 받은 개수
보낸 개수 — 받은개수로 집계해야하는데 왜냐? 누가 더 많이 주고 덜 받았는지를 알아야 하니까!
이렇게 하면 선물을 더 많이 준 사람이 혜택을 볼 수 있는거니께
예를 들어 A가 10개를 보내고 3개를 받았고 B가 5개를 보내고 8개를 받았으며 C가 4개를 보내고 4개를 받았다.
그럼 이건 A가 +7로 선물 지수가 높은 거고 (받은 거 보다 보낸 게 더 많음) B가 -3으로 선물 지수가 낮은 거고 (보낸 거보다 받은게 더 많으니까) C는 주고 받은 개수가 같으니 0이라고 본당
즉, 선물을 많이 줄수록 선물 지수가 높은 거고 많이 받을수록 선물 지수가 낮은거임
만약 어떤 둘이 서로는 선물을 주고 받은 적이 없다쳐도 결국 둘 중 선물 지수가 높은 사람이 추가 선물 받는다
- 다음 달 선물 교환 이제 서로 비교해서 누가 선물을 받을지 결정할거임
for i in 0..<friends.count {
for j in i+1..<friends.count {
let personA = friends[i]
let personB = friends[j]
let givenAtoB = giftCount[personA]?[personB] ?? 0
let givenBtoA = giftCount[personB]?[personA] ?? 0
if givenAtoB > givenBtoA {
nextGifts[personA]! += 1
} else if givenBtoA > givenAtoB {
nextGifts[personB]! += 1
} else {
let scoreA = giftScore[personA]!
let scoreB = giftScore[personB]!
if scoreA > scoreB {
nextGifts[personA]! += 1
} else if scoreB > scoreA {
nextGifts[personB]! += 1
}
}
}
}
giftScore 랑 giftCount 를 비교하는 단계!
A와 B 두 사람을 비교해서 더 많이 준 사람이 받음 -> 선물 집계 기반으로 룰은 그대로 가져간드아 -> 주고 받은 개수가 같으면 선물 지수 높은 사람이 받음 -> 선물 지수도 같다면 아무도 받지 않는 걸로 ㅇㅇ
- 결과 반환 최종적으로 가장 많이 받은 선물 개수 찾기
return nextGifts.values.max() ?? 0
// 가장 큰 값 반환
?? 0 -> 값이 없을 경우 0을 반환한다,,
쭉 한번 정리해보자
split(separator) : 문자열을 특정 구분자로 나누는 메서드
-> "A B" 를 ["A", "B"] 로 변환
map { String($0) } : split() 의 결과를 String 타입으로 변환
default: 0 : 딕셔너리에서 키가 없을 경우 기본값 0 을 넣어 안전히 값 추가
?? 0 : 딕셔너리에서 값이 없을 경우 nil 대신 0 반환
max() : 딕셔너리 값 중 가장 큰 값을 반환시킴
-> nil 이므로 ?? 0 처리,,
메타데이터
- post_id
- af8731ea8b79
- slug
- 25-03-27-til07-af8731ea8b79
- url
- https://medium.com/@hanshirley775/25-03-27-til07-af8731ea8b79
- canonical_url
- https://medium.com/@hanshirley775/25-03-27-til07-af8731ea8b79
- author_url
- https://medium.com/@hanshirley775
- status
- ok
- fetched_at
- 2026-08-06 07:53:32