← Back to list

25.03.27, TIL07–

와 비오고 흐리다 너무 신난다

sophie · 2025-03-27 08:20 · 0 claps · 5.2 min read
#code-kata #solutions #func #swift #return
Open on Medium ↗
Wiki topics: 📱 · Mobile Development

25.03.27, TIL 08

와 비오고 흐리다 너무 신난다

게로게로ㅔㄱ로

게로게로ㅔㄱ로

오늘도 화이팅!

밀려있던 알고리즘 코드 카타를 풀어보자

//제공된 코드 
import Foundation

func solution(_ friends: [String], _gifts: [String]) -> Int {
   return 0
}

….

…

뭐라는지 모르겠다

그치만

그래도 해야지 어떡해 헤헤..

먼저 해결해야하는 것은

  1. 친구들이 주고 받은 선물 데이터를 효율적으로 저장해야 하고
  2. 각 친구 별 선물 보낸 개수, 받은 개수 계산해야 하고
  3. 친구들끼리 비교하며 누가 선물을 받을지 결정해야 하고
  4. 선물을 가장 많이 받은 친구의 선물 개수를 출력해야 함

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
}
//친구들을 딕셔너리에 등록하고 초기값 설정
  1. 선물 교환 기록 저장 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
}
  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이라고 본당

즉, 선물을 많이 줄수록 선물 지수가 높은 거고 많이 받을수록 선물 지수가 낮은거임

만약 어떤 둘이 서로는 선물을 주고 받은 적이 없다쳐도 결국 둘 중 선물 지수가 높은 사람이 추가 선물 받는다

  1. 다음 달 선물 교환 이제 서로 비교해서 누가 선물을 받을지 결정할거임
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
            }
        }
    }
}

giftScoregiftCount 를 비교하는 단계!

A와 B 두 사람을 비교해서 더 많이 준 사람이 받음 -> 선물 집계 기반으로 룰은 그대로 가져간드아 -> 주고 받은 개수가 같으면 선물 지수 높은 사람이 받음 -> 선물 지수도 같다면 아무도 받지 않는 걸로 ㅇㅇ

  1. 결과 반환 최종적으로 가장 많이 받은 선물 개수 찾기
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