반응형
문제 설명
주어진 문자열에서 중복된 문자가 없는 가장 긴 서브스트링을 찾아야 합니다. 또한, 해당 서브스트링의 길이도 함께 출력해야 합니다.
예제
입력 : "aabcbbc"
출력 : 3 // "abc"
입력 : "bbbbbb"
출력 : 1 // "b"
입력 : "aaaaabbbcedfg"
출력 : 6 // "bcedfg"
해결 방법
이 문제를 해결하기 위해 슬라이딩 윈도우(Sliding Window) 기법과 해시셋(Hash Set) 을 사용합니다.
- 슬라이딩 윈도우: 문자열을 순회하면서, 현재 서브스트링의 길이를 유지하면서 중복 문자가 나오면 윈도우의 시작을 조정합니다.
- 해시셋: 현재 윈도우에서 중복 문자가 존재하는지 빠르게 확인하기 위해 사용합니다.
이제 Swift 코드로 구현해보겠습니다.
Swift 코드 구현
import Foundation
func longestUniqueSubstring(_ s: String) -> (length: Int, substring: String) {
var charSet = Set<Character>()
var left = 0
var maxLength = 0
var startIndex = 0
let chars = Array(s)
for right in 0..<chars.count {
while charSet.contains(chars[right]) {
charSet.remove(chars[left])
left += 1
}
charSet.insert(chars[right])
if right - left + 1 > maxLength {
maxLength = right - left + 1
startIndex = left
}
}
let longestSubstring = String(chars[startIndex..<(startIndex + maxLength)])
return (maxLength, longestSubstring)
}
// 테스트 예제
let testCases = ["aabcbcbc", "aaaaaaa", "abbbcedd"]
for testCase in testCases {
let result = longestUniqueSubstring(testCase)
print("Input: \(testCase) -> Output: \(result.length) // \(result.substring)")
}
실행 결과
코드 설명
- charSet 사용: 현재 윈도우 내에 존재하는 문자를 저장하여 중복을 확인합니다.
- 슬라이딩 윈도우: left는 윈도우의 시작 위치, right는 윈도우의 끝 위치입니다.
- 중복 문자 처리:
- charSet에 이미 문자가 존재하면 left를 이동하여 중복을 제거합니다.
- charSet에 문자가 없다면 추가합니다.
- 최대 길이 갱신: 현재 윈도우의 길이가 기존 maxLength보다 크면 값을 업데이트합니다.
시간 복잡도 분석
- 각 문자는 right 포인터에 의해 한 번 탐색되고, left 포인터에 의해 한 번 제거됩니다.
- 따라서 시간 복잡도는 O(n) 입니다.
반응형
'개발 일반' 카테고리의 다른 글
개발 및 운영의 개념 (샌드박스? 인하우스? CBT?) (0) | 2025.02.16 |
---|---|
프로그래밍 개발 뭐부터 시작하면 좋을까? (0) | 2025.02.16 |
Hashing(해싱) 개념 정리 (0) | 2025.02.15 |
GitHub를 활용한 이슈 관리 (6) | 2020.02.07 |
Agile 방법론에 대한 발췌글 (0) | 2020.02.02 |