스위프트 코딩테스트 강좌, 소수 & 팰린드롬 수 중에서 최솟값 찾기

안녕하세요! 이번 강좌에서는 소수(prime number)와 팰린드롬 수(palindrome number)의 중에서 최솟값을 찾는 알고리즘 문제를 살펴보도록 하겠습니다. 소수와 팰린드롬 수는 기본적인 수학 개념이지만, 이 둘을 결합하여 특정한 요구사항을 해결하는 문제는 코딩테스트에서 자주 등장합니다. 따라서 이 문제를 통해 효율적인 알고리즘 설계 및 구현 능력을 키워보세요.

문제 설명

주어진 범위 내의 모든 정수 중에서 소수이면서 팰린드롬 수인 수들의 최솟값을 찾는 함수를 작성하세요.

예를 들어, 1부터 100까지의 범위에서 소수이면서 팰린드롬 수인 숫자를 나열하면, 그 중에서 최솟값은 2입니다.

입력

정수 n (2 <= n <= 10,000)이 주어집니다. 이 범위 내에서 소수이면서 팰린드롬 수를 찾아야 합니다.

출력

소수이면서 팰린드롬 수들의 최솟값을 출력합니다. 만약 해당 조건을 만족하는 수가 없다면 “조건을 만족하는 수가 없습니다.”라는 메시지를 출력합니다.

문제 해결 과정

문제를 해결하기 위해서는 다음 단계로 나누어 해결할 수 있습니다:

  1. 소수를 판단하는 함수 작성하기
  2. 팰린드롬 수를 판단하는 함수 작성하기
  3. 입력된 범위 내에서 소수이면서 팰린드롬 수를 찾기
  4. 최솟값을 반환하기

1. 소수를 판단하는 함수 작성하기

소수는 1과 자기 자신만 약수로 가지는 수입니다. 이를 판단하기 위해, 2부터 sqrt(n)까지 숫자로 나누어지는지를 체크하여 소수 여부를 판단할 수 있습니다.

func isPrime(_ number: Int) -> Bool {
        guard number > 1 else { return false }
        for i in 2...Int(sqrt(Double(number))) {
            if number % i == 0 {
                return false
            }
        }
        return true
    }

2. 팰린드롬 수를 판단하는 함수 작성하기

팰린드롬 수는 앞으로 읽어도 뒤로 읽어도 같은 수입니다. 이를 체크하기 위해서는 수를 문자열로 변환한 후, 해당 문자열이 뒤집힌 것과 같은지를 비교하면 됩니다.

func isPalindrome(_ number: Int) -> Bool {
        let string = String(number)
        return string == String(string.reversed())
    }

3. 입력된 범위 내에서 소수이면서 팰린드롬 수 찾기

앞서 작성한 두 함수(isPrime, isPalindrome)를 활용하여 2부터 n까지의 모든 정수에서 이 두 조건을 만족하는 수를 확인합니다.

func findMinPrimePalindrome(upTo n: Int) -> Int? {
        var minPrimePalindrome: Int? = nil

        for i in 2...n {
            if isPrime(i) && isPalindrome(i) {
                if minPrimePalindrome == nil || i < minPrimePalindrome! {
                    minPrimePalindrome = i
                }
            }
        }
        return minPrimePalindrome
    }

4. 최솟값 반환하기

최솟값을 찾은 후 값을 반환합니다. 만약 최솟값이 없다면 적절한 메시지를 출력하도록 합니다.

let n = 100
if let minValue = findMinPrimePalindrome(upTo: n) {
    print("소수이면서 팰린드롬 수의 최솟값은: \(minValue)")
} else {
    print("조건을 만족하는 수가 없습니다.")
}

최종 코드

모든 부분을 통합하여 최종 코드를 작성하면 다음과 같습니다:

func isPrime(_ number: Int) -> Bool {
        guard number > 1 else { return false }
        for i in 2...Int(sqrt(Double(number))) {
            if number % i == 0 {
                return false
            }
        }
        return true
    }

    func isPalindrome(_ number: Int) -> Bool {
        let string = String(number)
        return string == String(string.reversed())
    }

    func findMinPrimePalindrome(upTo n: Int) -> Int? {
        var minPrimePalindrome: Int? = nil
        
        for i in 2...n {
            if isPrime(i) && isPalindrome(i) {
                if minPrimePalindrome == nil || i < minPrimePalindrome! {
                    minPrimePalindrome = i
                }
            }
        }
        return minPrimePalindrome
    }

    let n = 100
    if let minValue = findMinPrimePalindrome(upTo: n) {
        print("소수이면서 팰린드롬 수의 최솟값은: \(minValue)")
    } else {
        print("조건을 만족하는 수가 없습니다.")
    }

결론

이번 강좌에서는 스위프트 언어를 사용하여 소수이면서 팰린드롬 수를 찾는 문제를 다뤄보았습니다. 이 문제를 통해 기본적인 알고리즘 설계 및 구현 능력을 익힐 수 있었기를 바랍니다. 또한, 문제를 해결하기 위해서 여러 가지 기능을 모두 조합하여 사용하는 방법을 배웠습니다. 다음 강좌에서도 더욱 흥미롭고 도전적인 문제를 만나길 기대합니다!

감사합니다!