안녕하세요! 이번 글에서는 스위프트를 이용해 문자열을 찾는 문제를 풀어보겠습니다. 문자열 문제는 코딩 테스트에서 자주 등장하는 유형이며, 주로 효율적인 탐색 알고리즘과 문자열 처리 방법을 이해하는 데 큰 도움이 됩니다. 이번 강좌를 통해 문자열 처리의 기초를 탄탄히 다져보도록 하겠습니다.
문제 설명
다음은 문자열 찾기 문제입니다:
문자열
haystack
와needle
가 주어질 때,haystack
에서needle
이 처음 나타나는 위치를 찾는 함수를 작성하세요.needle
이 존재하지 않으면-1
을 반환해야 합니다.
예제:
haystack = "hello"
,needle = "ll"
=> 출력:2
haystack = "aaaaa"
,needle = "bba"
=> 출력:-1
haystack = ""
,needle = "
=> 출력:0
문제 접근 방법
이 문제를 해결하기 위해서는 문자열을 순차적으로 비교하면서 needle
이 haystack
내에서 나타나는 위치를 확인해야 합니다. 다음과 같은 절차로 문제를 해결할 수 있습니다:
- 먼저
needle
의 길이를 확인하고,haystack
의 길이와 비교하여needle
이haystack
에 있을 수 있는지를 판단합니다. - 그 후,
haystack
의 각 인덱스에서needle
의 길이만큼 부분 문자열을 추출하여 비교합니다. - 비교한 결과가 일치한다면 해당 인덱스를 반환하고,
needle
이haystack
내에서 발견되지 않는다면-1
을 반환합니다.
스위프트 코드 구현
이제 스위프트로 위의 로직을 구현해 보겠습니다:
func strStr(_ haystack: String, _ needle: String) -> Int {
let haystackCount = haystack.count
let needleCount = needle.count
// needle이 비어 있을 때는 0을 반환
if needleCount == 0 {
return 0
}
// haystack의 길이가 needle의 길이보다 짧으면 -1을 반환
if haystackCount < needleCount {
return -1
}
// haystack을 배열로 변환
let haystackArray = Array(haystack)
// 각 인덱스에서 needle의 부분 문자열과 비교
for i in 0...(haystackCount - needleCount) {
var j = 0
while j < needleCount && haystackArray[i + j] == needle[needle.index(needle.startIndex, offsetBy: j)] {
j += 1
}
// needle을 발견한 경우
if j == needleCount {
return i
}
}
// needle을 찾지 못한 경우
return -1
}
코드 설명
이제 작성한 코드에 대해 상세히 설명하겠습니다:
func strStr
: 주어진 두 개의 문자열haystack
과needle
를 인자로 받아 문자열 찾기를 수행하는 함수입니다.let haystackCount = haystack.count
:haystack
의 길이를 저장합니다.let needleCount = needle.count
:needle
의 길이를 저장합니다.if needleCount == 0
:needle
이 비어 있는 경우, 항상 0을 반환합니다.if haystackCount < needleCount
:haystack
의 길이가needle
보다 짧으면, 찾을 수 없으므로 -1을 반환합니다.let haystackArray = Array(haystack)
: 문자열을 배열로 변환하여 각 문자에 접근할 수 있도록 합니다.for i in 0...(haystackCount - needleCount)
:haystack
의 모든 인덱스에 대해 반복합니다. 반복문은needle
의 길이만큼 탐색해야 하므로, 길이를 고려하여 반복 범위를 설정합니다.- 내부
while
문에서는 각 인덱스에서needle
와haystack
의 부분 문자열을 비교합니다. - 비교가 모두 일치하면 인덱스
i
를 반환합니다. - 마지막으로,
needle
을 찾지 못한 경우 -1을 반환합니다.
테스트 케이스
이 코드를 검증하기 위해 몇 가지 테스트 케이스를 작성해 보겠습니다:
print(strStr("hello", "ll")) // 출력: 2
print(strStr("aaaaa", "bba")) // 출력: -1
print(strStr("", "")) // 출력: 0
print(strStr("abcde", "abc")) // 출력: 0
print(strStr("abcde", "xyz")) // 출력: -1
결론
이번 강좌에서는 스위프트로 문자열 찾기 문제를 해결하는 방법을 배웠습니다. 주어진 문제를 풀기 위해 문자열의 길이, 부분 문자열 비교 및 탐색 범위를 면밀히 확인하는 것이 중요하다는 점을 기억하시길 바랍니다. 문자열 관련 문제는 다양한 변형이 존재하므로, 연습을 통해 더욱 다양한 케이스를 처리할 수 있도록 노력해보시기 바랍니다.
다음 강좌에서는 다른 종류의 문자열 문제를 다루어 볼 예정입니다. 감사합니다!