-
hash,string,sort_LeetCode_49.GroupAnangram swift알고리즘/알고리즘 문제풀이 2022. 2. 21. 17:23
https://leetcode.com/problems/group-anagrams/
문제 접근
- 주어진 [String]매개변수를 sorted(by: >) 하여 stack에 할당
- !stack.isEmpty인 동안 while문 반복
- stack의 한 요소를 비교할 대상으로 선택, 해당 요소와 크기가 같은 비교군을 생성
- 처음 선택한 요소의 알파벳을 순차적으로 비교군에서 삭제, 결과적으로 ""가 된 idx를 얻게 됨
- idx를 사용하여 subSol:[String]에 appned하여 anagram집합을 구함.
- 5의 결과물을 ans: [[String]]에 append하여 최종 Return값을 준비.
- 5에서 사용된 요소들을 stack에서 삭제.
- 위의 내용을 반복하여 최종 return 수행
오답 코드
문제점: 매개변수 strs의 크기 및 각 요소의 크기가 커질수록 부하가 매우 커짐.
-> strs를 순회하는 method가 많기 때문.
testCase.111의 경우 문제점에 완벽히 해당함. -> 이를 해결하기 위해 hash를 사용해야 함.
더보기class Solution { func groupAnagrams(_ strs: [String]) -> [[String]] { var stack = strs.sorted(by: >) var ans: [[String]] = [] while !stack.isEmpty{ let target = stack.removeLast() var tempList = stack.filter({ $0.count == target.count }) let origin = tempList var subSol: [String] = [target] for char in target { for i in 0..<tempList.count { guard let index = tempList[i].firstIndex(of: char) else { continue } tempList[i].remove(at: index) } } var emptyTarget: [String] = [] for (idx,str) in tempList.enumerated() { if str.isEmpty { emptyTarget.append(origin[idx]) subSol.append(origin[idx]) } } var emptyIndex: [Int] = [] for tgt in emptyTarget { guard let temp = stack.firstIndex(of: tgt) else { continue } emptyIndex.append(temp) } emptyIndex.sort(by: >) for idx in emptyIndex { stack.remove(at: idx) } ans.append(subSol) } return ans } }정답 코드
문제 접근 :
- 해쉬를 위해 Dict를 사용.
- strs의 각 요소를 sort한 값을 key로 사용하고, sort하기 이전의 요소를 value로 추가.
- 모든 value를 array로 묶어서 반환.
func groupAnagrams(_ strs: [String]) -> [[String]] { var dict : [String:[String]] = [:] strs.forEach({ let sorted = String($0.sorted(by: >)) dict[sorted, default: []].append($0) }) return Array(dict.values) }'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
행렬_LeetCode_200. Number of island swift (0) 2022.02.28 카카오_프로그래머스_양궁대회 swift (0) 2022.02.28 카카오_프로그래머스_거리두기 확인하기 swift (0) 2022.02.21 그래프_백준_11724 swift (0) 2022.01.25 행렬_Leetcode_130.Surrounded Region Swift (0) 2022.01.25