https://programmers.co.kr/learn/courses/30/lessons/92334
카카오 2022 블라인드 코딩테스트
딕셔너리와 배열을 적절히 잘 활용해서 푸는 구현 문제
이름이 담긴 배열, "신고자 피신고자"가 담긴 배열, 자연수 K가 주어진다.
K번 이상 신고 당한 이용자는 이용이 정지되며, 이용자를 신고한 이용자에게 모두 메일이 1회 발송된다.
이용자는 무제한으로 신고할 수 있지만, 같은 이용자에 대한 신고는 중복되어도 1회로 취급된다.
이때, 이름이 담긴 배열과 같은 순서로 이용자들이 메일을 받은 횟수를 담은 배열을 반환하는 문제
접근방법
이름 : Set[ 나를 신고한 사람들의 이름 ] 형식의 딕셔너리와 이름 : 메일 받은 횟수 형식의 딕셔너리를 이용한다.
"신고자 피신고자"로 이루어진 배열을 순회하며 딕셔너리[피신고자]의 value에 신고자 이름을 추가한다. 이때 value는 Set 집합이다.
그래야 중복된 신고가 모두 1회로 취급된다.
그렇게 딕셔너리에 모든 데이터가 입력되면, 딕셔너리를 순회하며 배열의 크기가 K이상인 이용자들에 한하여
신고자들의 메일 받은 횟수를 1 증가시킨다.
이름이 담긴 배열을 순회하며 이름에 맞는 메일받은횟수를 결과 배열에 append한다.
(딕셔너리는 순서가 정해져 있지 않기 때문에 이 과정이 필요하다)
오답노트
코딩테스트를 봤을 때는 C++로 풀이했었다. 알다시피 C++로 문자열을 처리하기에는 swift보다 복잡한 면이 있어서
시간이 더 걸렸는데 Swift로 풀이하니까 훨씬 로직이 빨리 해결됐다.
소스코드
가독성이 좋은 코드를 작성하고자 변수 선언을 자주했다.
import Foundation
func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
var reporterList:[String:Set<String>] = [:]
id_list.forEach { reporterList[$0] = [] }
var numsOfSendingMail:[String:Int] = [:]
id_list.forEach { numsOfSendingMail[$0] = 0 }
for r in report {
let reporterAndRespondent:[String] = r.components(separatedBy:" ")
let reporter:String = reporterAndRespondent[0]
let respondent:String = reporterAndRespondent[1]
reporterList[respondent]!.insert(reporter)
}
reporterList.forEach {
if $0.value.count >= k {
for reporter in $0.value {
numsOfSendingMail[reporter]! += 1
}
}
}
return id_list.map { numsOfSendingMail[$0]! }
}
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 주차 요금 계산 (Swift) (0) | 2022.03.10 |
---|---|
[프로그래머스] k진수에서 소수 개수 구하기 (Swift) (0) | 2022.03.08 |
[프로그래머스] 큰 수 만들기 (Swift) (스터디) (0) | 2022.03.06 |
[프로그래머스] 빛의 경로 사이클 (C++) (0) | 2022.03.05 |
[프로그래머스] 소수찾기 (Swift) (0) | 2022.03.05 |