-
문자열?_programmers_ 신고 결과 받기 [swift]알고리즘/알고리즘 문제풀이 2022. 6. 24. 08:49
https://programmers.co.kr/learn/courses/30/lessons/92334
코딩테스트 연습 - 신고 결과 받기
문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의
programmers.co.kr
접근 방법
- 신고당한 사람: 신고한 사람 Dictionary를 만들자.
- 이 때, 신고한 사람이, 똑같은 사람을 신고하면 Count == 1 이므로, 1.의 Dic의 value는 Set<String>으로 한다.
- Dic.value.count >= k 일 때, stack에 Dic.value를 추가한다. 그렇다면 메일 받을 사람을 추가한 것.
- stack의 String을 같은 것 끼리 분리하여, return 한다.
위의 접근방법으로 만든 코드는 정답 코드 아래의 틀린코드이다.
정답 코드
접근 방법과의 차이는 stack이 responseDic으로 바뀐 점이다.
id_list의 element 중 하나를 id 라 칭할 때,
stack에서 id를 분리해내는 작업을 filter를 통해 했는데, stack이 클 경우, overhead가 크다.
때문에, dictionary로 변경하였다. 물론, stack을 fastEnumerate하여 갯수를 셀 수 있다.
성능에 있어서 틀린 코드보다 전체적으로 빨라짐을 알 수 있다.
더보기테스트 1 〉 통과 (0.18ms, 16.5MB) 테스트 2 〉 통과 (0.25ms, 16.5MB) 테스트 3 〉 통과 (1094.63ms, 33.9MB) 테스트 4 〉 통과 (0.38ms, 16.4MB) 테스트 5 〉 통과 (0.38ms, 16.5MB) 테스트 6 〉 통과 (9.95ms, 16.6MB) 테스트 7 〉 통과 (24.40ms, 16.9MB) 테스트 8 〉 통과 (48.88ms, 17.2MB) 테스트 9 〉 통과 (502.64ms, 24.5MB) 테스트 10 〉 통과 (470.04ms, 24.2MB) 테스트 11 〉 통과 (1042.94ms, 33.6MB) 테스트 12 〉 통과 (1.75ms, 16.5MB) 테스트 13 〉 통과 (1.54ms, 16.5MB) 테스트 14 〉 통과 (554.64ms, 24.4MB) 테스트 15 〉 통과 (959.62ms, 31.2MB) 테스트 16 〉 통과 (1.51ms, 16.6MB) 테스트 17 〉 통과 (1.59ms, 16.4MB) 테스트 18 〉 통과 (3.13ms, 16.6MB) 테스트 19 〉 통과 (5.60ms, 16.6MB) 테스트 20 〉 통과 (531.43ms, 24.6MB) 테스트 21 〉 통과 (977.77ms, 31MB) 테스트 22 〉 통과 (0.14ms, 16.6MB) 테스트 23 〉 통과 (0.13ms, 16.5MB) 테스트 24 〉 통과 (0.13ms, 16.6MB) import Foundation func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] { var dic: [String: Set<String>] = [:] // 신고당한 사람 : 신고한 사람들 var responseDic: [String: Int] = [:] // 메일받을 사람, 메일 수 for rep in report { let strs = rep.components(separatedBy: " ") if dic[strs[1]] == nil { dic[strs[1]] = [] dic[strs[1]]!.insert(strs[0]) } else { dic[strs[1]]!.insert(strs[0]) } } for info in dic { if info.value.count >= k { for receiver in info.value { if responseDic[receiver] == nil { responseDic[receiver] = 0 responseDic[receiver]! += 1 } else { responseDic[receiver]! += 1 } } } } var sol: [Int] = [] for id in id_list { sol.append(responseDic[id] ?? 0) } return sol }틀린 코드
예상되는 원인 : filter하며 시간을 다 까먹는거 같다.
더보기정확성 테스트테스트 1 〉 통과 (0.20ms, 16.4MB) 테스트 2 〉 통과 (0.31ms, 16.6MB) 테스트 3 〉 실패 (시간 초과) 테스트 4 〉 통과 (0.46ms, 16.5MB) 테스트 5 〉 통과 (0.43ms, 16.4MB) 테스트 6 〉 통과 (10.34ms, 16.7MB) 테스트 7 〉 통과 (28.38ms, 17MB) 테스트 8 〉 통과 (58.85ms, 17.2MB) 테스트 9 〉 통과 (5142.49ms, 25.9MB) 테스트 10 〉 통과 (508.23ms, 24.3MB) 테스트 11 〉 통과 (7507.48ms, 36MB) 테스트 12 〉 통과 (7.01ms, 16.7MB) 테스트 13 〉 통과 (2.12ms, 16.6MB) 테스트 14 〉 통과 (6854.26ms, 26.4MB) 테스트 15 〉 통과 (1187.41ms, 31.2MB) 테스트 16 〉 통과 (2.20ms, 16.5MB) 테스트 17 〉 통과 (2.15ms, 16.7MB) 테스트 18 〉 통과 (10.82ms, 16.7MB) 테스트 19 〉 통과 (16.50ms, 16.8MB) 테스트 20 〉 통과 (5806.61ms, 26.2MB) 테스트 21 〉 실패 (시간 초과) 테스트 22 〉 통과 (0.15ms, 16.7MB) 테스트 23 〉 통과 (0.16ms, 16.6MB) 테스트 24 〉 통과 (0.14ms, 16.3MB) 채점 결과정확성: 91.7합계: 91.7 / 100.0import Foundation func solution(_ id_list:[String], _ report:[String], _ k:Int) -> [Int] { var dic: [String: Set<String>] = [:] // 신고당한 사람 : 신고한 사람들 for rep in report { let strs = rep.components(separatedBy: " ") if dic[strs[1]] == nil { dic[strs[1]] = [] dic[strs[1]]!.insert(strs[0]) } dic[strs[1]]!.insert(strs[0]) } var responseStack: [String] = [] for info in dic { if info.value.count >= k { responseStack.append(contentsOf: info.value) } } var sol: [Int] = [] for id in id_list { sol.append(responseStack.filter{$0 == id}.count) } return sol }'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
스택/큐_Programmgers_기능개발 [swift] (0) 2024.08.22 해쉬_Programmgers_베스트앨범 [swift] (0) 2024.08.22 문자열_codility_binaryGap [swift] (0) 2022.06.19 dijkstra(최단거리)_LeetCode_1514 [swift] (0) 2022.05.25 Dijkstra(최단거리)_programmers_가장 먼 노드 (0) 2022.05.25