반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 프로그래머스 - 신고 결과 받기 문제를 풀었습니다.
목차
Github
문제 링크
https://programmers.co.kr/learn/courses/30/lessons/92334?language=swift#
풀이
중요하다고 생각한 부분
해당 문제에서 중요하다고 여겨진 것은 아래와 같습니다.
- 누가 누구를 신고했는가
- 누가 몇 번 신고 당했는가
1번 누가 누구를 신고했는가는 "신고 당한 사람" : [신고한 사람들] 딕셔너리로 선언을 해서 구현을 했습니다.
2번 누가 몇 번 신고 당했는가는 1번의 딕셔너리 value의 Array count를 이용하면 됩니다.
var reportDicts: [String:[String]] = [:]
해맨 부분
문제를 풀며 해맨 부분은 아래와 같습니다.
- Dictionary는 순서가 없는데 출력의 순서를 어떻게 고정시키는가
- 신고 내용의 중복은 안 된다는 것
1번은 "Dictionary는 순서가 없다"라는 것은 알고 있었지만 고정을 할 수 있는 메서드나 옵션 등을 살펴 보았습니다.
하지만 그런 건 없었고... 결국에는 이름 : index 딕셔너리를 선언해서 index를 저장하였습니다.
딕셔너리로 선언한 이유는 이름을 이용해 index를 쉽게 얻기 위함입니다.
var ids: [String:Int] = [:] //index를 저장하기 위한 딕셔너리
for reporter in reporters {
results[ids[reporter]!] += 1
}
2번은 report를 Set으로 바꾼 뒤 다시 Array로 바꿔서 해결했습니다.
Set은 중복을 허용하지 않기 때문에 쉽게 중복을 제거할 수 있습니다.
let reports = Array(Set(report)) //신고 중복 제거
다른 풀이도 살펴봤는데 어떤 분은 조건문을 이용해 처리를 하신 것을 보았습니다.
가독성 면에서는 조건문으로 처리하는 게 더 좋을 수도 있겠다는 생각을 했습니다.
전체 코드
func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] {
let reports = Array(Set(report)) //신고 중복 제거
var results = Array(repeating: 0, count: id_list.count)
var reportDicts: [String:[String]] = [:]
var ids: [String:Int] = [:] //index를 저장하기 위한 딕셔너리
//초기화
for (index, id) in id_list.enumerated() {
ids[id] = index
reportDicts[id] = []
}
//신고 당한 사람 : 신고한 사람
for report in reports {
let splitItem = report.split(separator: " ")
let reporter = String(splitItem.first!)
let reported = String(splitItem.last!)
reportDicts[reported]?.append(reporter)
}
//reportDicts을 기반으로 count 증가
for name in ids.keys {
let reporters = reportDicts[name]!
if reporters.count >= k {
for reporter in reporters {
results[ids[reporter]!] += 1
}
}
}
return results
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형