스위프트 코딩테스트 강좌, 문자열 찾기

안녕하세요! 이번 글에서는 스위프트를 이용해 문자열을 찾는 문제를 풀어보겠습니다. 문자열 문제는 코딩 테스트에서 자주 등장하는 유형이며, 주로 효율적인 탐색 알고리즘과 문자열 처리 방법을 이해하는 데 큰 도움이 됩니다. 이번 강좌를 통해 문자열 처리의 기초를 탄탄히 다져보도록 하겠습니다.

문제 설명

다음은 문자열 찾기 문제입니다:

문자열 haystackneedle가 주어질 때, haystack에서 needle이 처음 나타나는 위치를 찾는 함수를 작성하세요. needle이 존재하지 않으면 -1을 반환해야 합니다.

예제:

  • haystack = "hello", needle = "ll" => 출력: 2
  • haystack = "aaaaa", needle = "bba" => 출력: -1
  • haystack = "", needle = " => 출력: 0

문제 접근 방법

이 문제를 해결하기 위해서는 문자열을 순차적으로 비교하면서 needlehaystack 내에서 나타나는 위치를 확인해야 합니다. 다음과 같은 절차로 문제를 해결할 수 있습니다:

  1. 먼저 needle의 길이를 확인하고, haystack의 길이와 비교하여 needlehaystack에 있을 수 있는지를 판단합니다.
  2. 그 후, haystack의 각 인덱스에서 needle의 길이만큼 부분 문자열을 추출하여 비교합니다.
  3. 비교한 결과가 일치한다면 해당 인덱스를 반환하고, needlehaystack 내에서 발견되지 않는다면 -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: 주어진 두 개의 문자열 haystackneedle를 인자로 받아 문자열 찾기를 수행하는 함수입니다.
  • 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문에서는 각 인덱스에서 needlehaystack의 부분 문자열을 비교합니다.
  • 비교가 모두 일치하면 인덱스 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

결론

이번 강좌에서는 스위프트로 문자열 찾기 문제를 해결하는 방법을 배웠습니다. 주어진 문제를 풀기 위해 문자열의 길이, 부분 문자열 비교 및 탐색 범위를 면밀히 확인하는 것이 중요하다는 점을 기억하시길 바랍니다. 문자열 관련 문제는 다양한 변형이 존재하므로, 연습을 통해 더욱 다양한 케이스를 처리할 수 있도록 노력해보시기 바랍니다.

다음 강좌에서는 다른 종류의 문자열 문제를 다루어 볼 예정입니다. 감사합니다!