-
[LeetCode | Python] 443. String Compression개발/알고리즘 2025. 3. 18. 00:39
느낀점
투포인터를 알차게 잘 활용했던 문제로, 공간복잡도의 제약을 잘 고려하여 풀어야하는 문제이다. 뭔가 투 포인터라는 감은 잡히는데, 순간 세개의 포인터가 필요하려나 싶었다.
문제
https://leetcode.com/problems/string-compression/description/
문자 배열 chars가 주어졌을 때, 다음 알고리즘을 사용하여 배열을 압축하세요.
- 빈 문자열 s로 시작합니다.
- chars에서 연속적으로 반복되는 문자 그룹을 찾습니다.
- 그룹 길이가 1이면 해당 문자를 s에 추가합니다.
- 그룹 길이가 1보다 크면 해당 문자와 그룹 길이를 s에 추가합니다. (길이가 10 이상이면 여러 문자로 분리합니다.)
- 압축된 문자열 s를 별도로 반환하지 않고, 입력 배열 chars에 직접 저장합니다.
- 입력 배열을 수정한 후, 배열의 새로운 길이를 반환합니다.
- 추가적인 공간 복잡도는 상수 공간만 사용해야 합니다.
풀이
각각 포인터 두개를 두고, 하나는 리스트의 앞부분을 순차적으로 수정해주는 포인터, 다른 하나는 얼마나 문자가 반복되는지 확인해주는 포인터이다. 이중 반복문 처럼 보이지만 각 포인터가 배열을 순차적으로 순회하며, 내부 루프들의 실행 횟수 또한 N에 비례하므로, 전체 알고리즘의 시간 복잡도는 O(N)이 되었다.
class Solution: def compress(self, chars: List[str]) -> int: start_pointer = 0 last_pointer = 0 while last_pointer < len(chars): curr_letter = chars[last_pointer] cnt = 0 while last_pointer < len(chars) and curr_letter == chars[last_pointer]: cnt += 1 last_pointer += 1 chars[start_pointer] = curr_letter start_pointer += 1 if cnt > 1: for c in str(cnt): chars[start_pointer] = c start_pointer += 1 return start_pointer
결과
- 공간복잡도: $$ O(N) $$
- 시간복잡도: $$ O(1) $$
'개발 > 알고리즘' 카테고리의 다른 글
하루히 문제 (Haruhi Problem) (0) 2025.04.05 [LeetCode | Python] 55. Jump Game (0) 2025.03.23 [LeetCode | Python] 29. Divide Two Integers (0) 2025.03.22 [LeetCode | Python] 240. Search a 2D Matrix II (0) 2025.03.16 [Loop Strategy] Peter Bro Miltersen - 100명의 죄수 문제 (0) 2023.05.29