-
PrefixSum_Leetcode_2381. Shifting Letters II [swift]알고리즘/알고리즘 문제풀이 2025. 3. 24. 16:20
https://leetcode.com/problems/shifting-letters-ii/description/
문제접근
- shift의 정보를 Dictionary의 형태로 변형한다.
- String의 특정 index에 대한 이동 값을 모두 더한 뒤, 수행하기 위해서
- 매개변수로 전달된 초기 String s를 Dictionary의 정보를 바탕으로 다른 알파벳으로 변환한다.
오답풀이
실패 사유: 시간초과. O(mn)
gpt가 제안하는 해결방법: 차분배열을 쓰면 O(m+n)이 가능하다.
더보기더보기class Solution { func shiftingLetters(_ s: String, _ shifts: [[Int]]) -> String { var instructionMap = [Int: Int]() for infos in shifts { for index in infos[0]...infos[1] { if infos[2] == 1 { instructionMap[index, default: 0] += 1 } else { instructionMap[index, default: 0] -= 1 } } } let sol: [Character] = s.enumerated().map { (index, char) in if let inst = instructionMap[index] { return moveCharacter(target: char, magnitude: inst) } else { return char } } return String(sol) } func moveCharacter(target: Character, magnitude: Int) -> Character { let list = Array("abcdefghijklmnopqrstuvwxyz") let size = list.count guard let targetIndex = list.firstIndex(of: target) else { return target } let adjustMagnitude = ((magnitude % size) + size) % size let returnIndex = (targetIndex + adjustMagnitude) % size return list[returnIndex] } }
정답풀이
더보기더보기class Solution { func shiftingLetters(_ s: String, _ shifts: [[Int]]) -> String { let n = s.count var diff = [Int](repeating: 0, count: n) for infos in shifts { let value = infos[2] == 1 ? 1 : -1 diff[infos[0]] += value if infos[1] + 1 < n { diff[infos[1] + 1] -= value } } var sol = Array(s) var currentShifting = 0 for (index, differ) in diff.enumerated() { currentShifting += differ guard currentShifting != 0 else { continue } sol[index] = moveCharacter(target: sol[index], magnitude: currentShifting) } return String(sol) } func moveCharacter(target: Character, magnitude: Int) -> Character { let list = Array("abcdefghijklmnopqrstuvwxyz") let size = list.count guard let targetIndex = list.firstIndex(of: target) else { return target } let adjustMagnitude = ((magnitude % size) + size) % size let returnIndex = (targetIndex + adjustMagnitude) % size return list[returnIndex] } }
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
Backtracking_Leetcode_17. Letter Combinations of a Phone Number (0) 2025.03.25 dijkstra_Programmers_배달 [swift] (0) 2025.03.25 PrefixSum_Leetcode_303. Range Sum Query - Immutable [swift] (0) 2025.03.13 PrefixSum_Leetcode_238. Product of Array Except Self [swift] (0) 2025.03.13 PrefixSum_Leetcode_1248. Count Number of Nice Subarrays [swift] (0) 2025.03.11 - shift의 정보를 Dictionary의 형태로 변형한다.