Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 전략패턴 #StrategyPattern #디자인패턴
- 개발자부트캠프추천
- 인프콘 2024
- 디자인패턴
- 프로그래머스 이중우선순위큐
- 빈 조회 2개 이상
- infcon 2024
- 디자인 패턴
- 항해99
- TiL
- DesignPattern
- 취업리부트코스
- JavaScript
- KPT회고
- 프로그래머스
- 코딩테스트 준비
- Spring multimodule
- jwt
- spring batch 5.0
- 단기개발자코스
- 1주일회고
- 개발자 취업
- Python
- 99클럽
- 파이썬
- 빈 충돌
- @FeignClient
- 커스텀 헤더
- 구글 OAuth login
- jwttoken
Archives
- Today
- Total
m1ndy5's coding blog
[수학] 백준 1929번 소수 구하기 with python 본문
https://www.acmicpc.net/problem/1929
1번째 풀었던 방법
import math
start, end = map(int, input().split())
num = []
for i in range(start, end+1):
if i != 1:
num.append(i)
for i in range(2, int(math.sqrt(end))+1):
j = 2
while i*j <= end:
if i*j in num:
num.remove(i*j)
j += 1
for n in num:
print(n)
시간초과가 났다.
내가 생각하는 이유는 리스트.remove() 함수에서 난거 같다.
왜냐하면 remove는 앞에서부터 숫자를 순차적으로 찾아오기 때문에 O(N)의 시간복잡도를 갖는다.
N이 1억일 때 1초걸린다고 하면
숫자가 커졌을 때 for문도 O(N) remove도 O(N)이 되어 O(N^2)이 되므로 시간초과가 발생하는 것 같다.
import math
start, end = map(int, input().split())
num = [1]*(end+1)
num[0] = 0
num[1] = 0
for i in range(2, int(math.sqrt(end))+1):
j = 2
while i*j <= end:
if num[i*j] == 1:
num[i*j] = 0
j += 1
for i in range(start, end+1):
if num[i] == 1:
print(i)
remove함수를 빼고 인덱스 자체로 접근하니 바로 해결되었다.
일단 이 문제의 키는 숫자 하나하나를 소수인지 아닌지 판별하는 것이 아닌 2의 배수를 없애고 3의 배수를 없애고 이런식으로 했을 때 남은 나머지 숫자가 소수다 라는 에라토스테네스의 체의 개념을 사용하여 풀면 되는 문제였다.
'알고리즘 with python > 수학' 카테고리의 다른 글
[수학] 백준 2609번 최대공약수와 최소공배수 with python (유클리드 호제법) (0) | 2023.03.01 |
---|---|
[수학] 백준 15649번 N과 M(1) with python (0) | 2023.03.01 |
[수학] 백준 4948번 베르트랑 공준 with Python(pypy3와 python3의 차이점은?) (0) | 2023.02.27 |
[수학] 백준 1978 소수 찾기 with python (0) | 2023.02.27 |
[수학] 백준 8393번 합 with Python (0) | 2023.02.26 |