Where who wants to meet someone

백준 Swift [4134] 다음 소수 본문

백준 알고리즘 문제 기록/약수, 배수와 소수 2

백준 Swift [4134] 다음 소수

Lust3r 2023. 8. 18. 19:07
728x90

난이도

실버 IV

 

문제

https://www.acmicpc.net/problem/4134

 

4134번: 다음 소수

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다.

www.acmicpc.net

 

내 답안

import Foundation

func test(with inputValue: Int) -> Bool {
    if inputValue < 2 {
        return false
    }

    for i in 2..<Int(sqrt(Double(inputValue)) + 1) {
        if inputValue % i == 0 {
            return false
        }
    }

    return true
}

for _ in 1...Int(readLine()!)! {
    var input = Int(readLine()!)!

    while !test(with: input) {
        input += 1
    }

    print(input)
}
  • 문제의 힌트(루트 N까지만 나눠서 소수를 판별)를 생각하여 로직을 구성해보았다.
  • 처음에는 sqrt 메서드로 인한 컴파일 에러, 이후에는 수없이 많은 런타임 에러와 시간초과를 마주하게 되었다.
  • 각 코드를 다시 살펴보니 런타임 에러는 로직에 문제가 있었을 때, 시간 초과는 한 for문 안에서 모든 것을 처리하려다 보니 생긴 것 같았다.
  • 하여 시간초과 문제를 해결하기 위해 로직 부분을 test 메서드로 따로 빼내어 사용을 하였고(기존에는 while true로 해서 그 스코프에서 test 메서드를 수행) 문제를 해결할 수 있었다.
  • test 결과가 false이면 while문을 계속 돌면서 input값을 증가시키고, test에서는 2보다 작으면 false(소수는 1과 자기 자신을 약수로 가지는 것이기 때문)를 반환하고, 2 이상이면 for문을 통해 2부터 루트 N까지 돌면서 나눠지는 값이 있는지 확인하는 로직을 거친다.