일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 프로그래머스 답
- 카카오 2021
- 프로그래머스
- 스위프트
- 문제
- SwiftUI
- swift
- 소수
- 카카오
- swift 배열
- 머신러닝
- coco 데이터셋
- 이미지학습
- swift 시작
- c언어
- 데이터셋 만들기
- 카카오 2020
- kakao 2018
- ios 개발 시작
- 날씨 앱
- 최솟값 만들기
- Kakao
- Siwft
- 파이썬
- Python
- fast.ai
- roboflow
- 카카오 2019
- 카카오 2018
- supervisely
Archives
- Today
- Total
잡초의 일지
[Swift] 프로그래머스 | 코딩테스트 연습 -> 연습문제 -> 소수 찾기 본문
728x90
반응형
SMALL
처음에는 지금껏 풀어왔던 것과 같이,
for문을 반복하며 0으로 나누어 떨어지면 소수로 판별하는 방식으로 풀었다.
더보기
func solution(_ n:Int) -> Int {
var count = 1
if n >= 3{
for i in 3...n{
// i가 소수인가 판별 후 count ++
var isPrime = true
for j in 2...i-1{
if (i%j == 0){
isPrime = false
break
}
}
if (isPrime){
count += 1
}
}
}
return count
}
하지만, 아무리 코드를 줄여봐도 시간초과가 났고,
접근방식이 잘못되었다고 생각해 찾아보았다.
소수를 구할 때에 가장 콤펙트한 방법은 에라토스테네스의 채를 활용하는것이라고 한다.
(아래의 링크에 설명과 예시 코드가 있다.)
지금까지 풀어왔던 방법처럼 for문을 반복하며 소수를 구하는 방법과 에라토스테네스의 채와 의 다른점은,
에라토스테네스의 채에서는 소수의 배수를 지워, 불필요한 연산을 줄인다는 것이었다.
예를 들어, 2가 소수이면, 2의 배수는 소수가 되지 못하기 때문에 모두 지운다.
for문으로 반복하며 구하는 방법에서는 2의 배수들도 계산하기 때문에 불필요한 계산을 또 하게 된다.
에라토스테네스의 채를 이용하여 바꾸어 문제를 풀었더니, 시간초과와 효율성 모두 좋은 점수였다.
func solution(_ n:Int) -> Int {
/* 2부터 n까지 n-1개를 저장할 수 있는 배열 할당
배열 참조 번호와 소수와 일치하도록 배열의 크기는
n+1 길이만큼 할당(인덱스 번호 0과 1은 사용하지 않음) */
/* 배열초기화: 처음엔 모두 소수로 보고 true값을 줌 */
var PrimeArray = Array(repeating: true, count: n+1)
/* 에라토스테네스의 체에 맞게 소수를 구함
만일, PrimeArray[i]가 true이면 i 이후의 i 배수는 약수로 i를
가지고 있는 것이 되므로 i 이후의 i 배수에 대해 false값을 준다.
PrimeArray[i]가 false이면 i는 이미 소수가 아니므로 i의 배수 역시
소수가 아니게 된다. 그러므로 검사할 필요도 없다.
또한 i*k (k < i) 까지는 이미 검사되었으므로 j시작 값은 i*2 에서 i*i로 개선할 수 있다. */
var i = 2
while i*i <= n {
if (PrimeArray[i]){
var j = i*i
while j <= n {
PrimeArray[j] = false
j += i
}
}
i += 1
}
let res = PrimeArray.filter { $0 == true }
/* return할때 PrimeArray에서 사용하지 않았던 0번과1번 인덱스를 빼준다. */
return (res.count - 2)
}
728x90
반응형
LIST
'[코딩] 문제풀기 > Swift' 카테고리의 다른 글
[Swift] 프로그래머스 | 코딩테스트 연습 -> 연습문제 -> x만큼 간격이 있는 n개의 숫자 (0) | 2021.05.17 |
---|---|
[Swift] 프로그래머스 | 코딩테스트 연습 -> 2018 KAKAO BLIND RECRUITMENT -> [1차] 비밀지도 (0) | 2021.02.20 |
[Swift] 프로그래머스 | 코딩테스트 연습 -> 2019 KAKAO BLIND RECRUITMENT -> 실패율 (0) | 2021.02.20 |
[Swift] 프로그래머스 | 코딩테스트 연습 -> 2021 KAKAO BLIND RECRUITMENT -> 신규 아이디 추천 (0) | 2021.02.20 |
[Swift] 프로그래머스 | 코딩테스트 연습 -> 2020 카카오 인턴십 -> 키패드 누르기 (0) | 2021.02.19 |
Comments