입력 N보다 큰 소수이면서, 팰린드롬인 가장 작은 수를 구해야 하기 때문에,
에라토스테네스의 체 알고리즘을 사용하여 최대 값인 1,000,000까지의 소수를 판별 후
N 보다 큰 수를 돌면서 소수인지 확인 및 팰린드롬인 수인지 확인해야 함
첫 번째 시도
팰린드롬인 수 판별을 투 포인터를 이용하여 구현 → 테스트 케이스는 통과하지만, “틀렸습니다”
let maxNum = 1000000
var isPrime = Array(repeating: true, count: maxNum + 1)
isPrime[0] = false
isPrime[1] = false
for i in 2...maxNum {
if !isPrime[i] { continue }
for j in stride(from: i * i, through: maxNum, by: i) {
isPrime[j] = false
}
}
// 소수 배열 (isPrime 배열의 true 값을 가진 index가 바로 소수인 숫자)
let primeNum = isPrime.enumerated().filter{$0.1}.map{$0.0}
// 팰린드롬 수인지 판별
func isPalindrome(num: Int) -> Bool {
let str = String(num).map{$0}
var left = 0
var right = str.count - 1
while left <= right {
if str[left] == str[right] {
left += 1
right -= 1
} else {
return false
}
}
return true
}
let N = Int(readLine()!)!
for i in N...maxNum {
if isPrime[i] && isPalindrome(num: i) {
print(i)
break
}
}
두 번째 시도
문제를 읽고 또 읽어보니 “N보다 크거나 같고, 소수이면서 팰린드롬인 수 중에서, 가장 작은 수를 구하는” 에서 이 수가 N의 최대 값 (1,000,000)보다 작다고 한 적은 없었다..
따라서, 출력 값은 1,000,000보다 클 수도 있다!
→ maxNum의 범위를 더 큰 수로 변경하니 통과되었다.
let maxNum = 2000000 // 1,000,000보다 큰 수로 변경
var isPrime = Array(repeating: true, count: maxNum + 1)
isPrime[0] = false
isPrime[1] = false
for i in 2...maxNum {
if !isPrime[i] { continue }
for j in stride(from: i * i, through: maxNum, by: i) {
isPrime[j] = false
}
}
// 소수 배열 (isPrime 배열의 true 값을 가진 index가 바로 소수인 숫자)
let primeNum = isPrime.enumerated().filter{$0.1}.map{$0.0}
// 팰린드롬 수인지 판별
func isPalindrome(num: Int) -> Bool {
let str = String(num).map{$0}
var left = 0
var right = str.count - 1
while left <= right {
if str[left] == str[right] {
left += 1
right -= 1
} else {
return false
}
}
return true
}
let N = Int(readLine()!)!
for i in N...maxNum {
if isPrime[i] && isPalindrome(num: i) {
print(i)
break
}
}
728x90
'알고리즘 문제(Swift)' 카테고리의 다른 글
알고리즘 문제(Swift) - 백준 - 1010 (다리놓기) (0) | 2025.01.04 |
---|---|
알고리즘 문제(Swift) - 백준 - 9613 (GCD의 합) (2) | 2025.01.03 |
알고리즘 문제(Swift) 백준 - 17087 (숨바꼭질 6) (0) | 2025.01.03 |
알고리즘 문제(Swift) - 백준 17103 (골드바흐 파티션) (1) | 2025.01.02 |
알고리즘 문제(Swift) - 백준 6658 (골드바흐의 추측) (1) | 2025.01.02 |