*문제 본문은 강의 내용과 관련되어 있어 자세하게 적지 않았습니다.
문제
자연수 N이 입력되면 1부터 N까지의 소수의 개수를 출력하는 프로그램을 작성하세요.
풀이
• 내 풀이
import sys
input = sys.stdin.readline
N = int(input())
sosu = list()
def check_sosu(n):
for i in range(2, n):
if n%i == 0:
return False
for j in range(2, N):
if check_sosu(j) == False:
continue
else:
sosu.append(j)
print(len(sosu))
• 답안 : Python
import sys
input = sys.stdin.readline
N = int(input())
sosu = [0] * (N+1)
count = 0
for i in range(2, N+1):
if sosu[i] == 0:
count += 1
for j in range(i, N+1, i):
sosu[j] = 1
print(count)
• 답안 : Kotlin (내가 바꿔본 것 / 정확X)
import java.io.*
import java.util.*
fun main(args: Array<String>) = with(BufferedReader(InputStreamReader(System.`in`))){
var N = readLine().toInt()
// .toMutableList() 해주지 않으면 읽기 전용 List를 반환하게 된다.
var sosu = (1..N+1).map{0}.toMutableList()
var count = 0
for(i in 2 until N+1) {
if(sosu[i] == 0) {
count += 1
for(j in i until N+1 step i) {
sosu[j] = 1
}
}
}
print(count)
}
- 단순히 소수를 찾아서 개수를 출력하는 것에만 초점을 두고 코드를 짰는데, 답안을 보니 제일 빠른 방법으로 소수 개수를 구하는 방법이 있다는 것을 알게 되었고, 시간도 빠르면서 코드도 간단한 것을 보고 더 좋은 코드에 대해서 고민하는 노력을 해야겠다고 생각했다.
- 가장 빠른 방법으로 소수 개수를 구하는 방법을 '에라토스테네스 체' 라고 한다고 한다. (여기서 체는 '거르는 체')
[로직 설명]
- 인덱스가 N+1개만큼 있고, 0으로 초기화된 리스트를 선언해준다.
(인덱스 번호로 접근하는데, 리스트 인덱스는 0부터 시작하기 때문에 +1을 해준다.)
- 만약 소수라면 해당 인덱스의 값은 0, 소수가 아니라면 1이 들어가게 된다.
- 해당 인덱스의 값이 0이라면(= 소수일 때) count를 1 증가시켜준다.
- 두번째 for문에서는 range()로 범위를 설정할 때, step을 이용해서 해당 인덱스의 배수들을 걸러내는 작업을 진행한다.
'💻 코딩테스트 > 파이썬 알고리즘 문제풀이' 카테고리의 다른 글
[파이썬 알고리즘 문제풀이 입문] 코드 구현력 기르기 - 주사위 게임 (0) | 2023.04.25 |
---|---|
[파이썬 알고리즘 문제풀이 입문] 코드 구현력 기르기 - 뒤집은 소수 (0) | 2023.04.24 |
[파이썬 알고리즘 문제풀이 입문] 코드 구현력 기르기 - 자릿수의 합 (0) | 2023.04.11 |
[파이썬 알고리즘 문제풀이 입문] 코드 구현력 기르기 - 정다면체 (0) | 2023.04.07 |
[파이썬 알고리즘 문제풀이 입문] 코드 구현력 기르기 - 대표값 (0) | 2023.04.07 |