TIL/알고리즘 공부
백준 4948번 Swift 알고리즘 연습
여의도사노비
2022. 9. 5. 23:09
728x90
베르트랑 공준이라는 개념이 나오는 문제이다.
결국 입력받는 값 ~ 입력받는 값 * 2 의 범위 내에서 소수를 찾아 카운팅하면 된다.
문제의 난이도는 에라토스테네스의 채만 이해하고 있으면 금방 풀만한 난이도였던 것 같다.
하지만 이번에도 시간 초과 오류가 발생하여 꽤나 여러번 삽질을 했다...
이 문제를 풀면서 생각한 논리적 흐름은
- 에라토스테네스의 채 개념을 적용하기 위해서는 2이상의 수부터 시작하는 것이 좋겠다는 생각이 들었다.
- 그래서 입력받는 값을 최대 값으로 설정하고 (2*n) 0 ~ 2*n의 범위 내에 모든 소수를 도출했다.
- 그 후 입력받은 n부터 2*n의 범위 내에 있는 소수 값들만 counting 해주면 끝.
위와 같은 방식으로 진행했지만 처음에 시간 오류가 났다.
n이 0일 경우 break 해주는 if 문에 print(count)까지 입력을 해준 것이 문제였던 것 같다.
심지어 처음엔 if 문이 맨 마지막에 있었기 때문에 0을 입력 받았을 경우 바로 break 되지 않고 한 번 더 사이클을 도는 것이 미세하지만 차이를 만들었을지도..!
* 4948번
for _ in 1... {
let n = Int(readLine()!)!
var arr: [Int] = Array(repeating: 0, count: 2 * n + 1)
var count = 0
if n == 0 {
break
}
for i in 2...2 * n {
arr[i] = i
}
for j in 2...2 * n {
for k in stride(from: j + j, through: 2 * n, by: j) {
arr[k] = 0
}
}
for k in n+1...2*n {
if arr[k] != 0 {
count += 1
}
}
print(count)
}
정리(Today I Learned)
- 알고리즘을 풀다보니 내가 보기 쉽게 그냥 단순 변수명으로 정해놓고 푸는 경우가 있는데... 앞으로는 좀 더 변수명에 신경써서 다시 알고리즘을 봤을 때 헷갈릴 수 있는 부분을 최소화 해야겠다는 생각이 든다.