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 | 29 | 30 | 31 |
Tags
- 파이썬 3
- 부스트캠프_AITech3기
- dfs
- 이진탐색
- python3
- 알고리즘스터디
- Level2
- 백준
- 단계별문제풀이
- 다시보기
- Level1
- 구현
- 백트랙킹
- 알고리즘_스터디
- 그리디
- 개인회고
- 정렬
- 프로그래머스
- 그래프이론
- 부스트캠프_AITech_3기
- ODQA
- dp
- Level2_PStage
- mrc
- 기술면접
- 최단경로
- 주간회고
- 이코테
- 글또
- U_stage
Archives
- Today
- Total
국문과 유목민
(Week4)[소수찾기] 에라토스테네스의 체 본문
주간 코딩스터디 때 푼 문제들을 정리하고 있습니다. 구체적인 문제에 대한 정보는 게시글 내 링크를 살펴봐주세요
소요시간: 30분
1. 문제 설명
https://www.acmicpc.net/problem/2960
2960번: 에라토스테네스의 체
2, 4, 6, 8, 10, 3, 9, 5, 7 순서대로 지워진다. 7번째 지워진 수는 9이다.
www.acmicpc.net
에라토스테네스의 방식으로 소수를 구하지만, K번째로 지워지는 수를 출력한다.
2. 접근 방식
- 에라토스테네스 방식을 그대로 구현하되, 중간에 값을 확인할 수 있는 변수를 넣어주고, 해당 변수가 K번째일 때의 값을 리턴시켜준다.
- 해당 문제의 경우 소수도 지우는 것도 카운팅해야 한다. 기존 에라토스테네스의 알고리즘은 소수는 살려뒀었음.
코드를 구현하고, 생각보다 코드가 깔끔하지 않아서, 코드를 리팩토링 했다.
3. 코드
1) 초기 코드
n, k = list(map(int, input().split()))
dp = [0]*(n+1)
import math
def eratos(n, k):
count = 0
for p in range(2, n+1):
if dp[p] == 0:
i = 1
while i*p <= n:
if dp[i*p] == 1:
pass
else:a
dp[i*p] = 1
count += 1
if count == k:
print(i*p)
break
i+=1
else:
continue
eratos(n, k)
2) 리팩토링'
n, k = list(map(int, input().split()))
import math
def eratos(n, k):
dp = [0]*(n+1)
for p in range(2, n+1): # 루트를 씌워서 하는 방법?
if dp[p] == 0:
for i in range(p, n+1, p):
if dp[i] == 0:
dp[i] = 1
if sum(dp) == k:
print(i)
break
4. 코멘트
- 처음 코드보다는 깔끔해진 것 같다. while문 대신 for문에 jump를 줬고, 별도의 변수를 통해 count하지 않아서 오히려 효율성이 더 증가했다.
- 백준 기준으로 보면, 시간 복잡도와 공간복잡도가 확실히 줄었음을 확인할 수 있다.
'알고리즘_코딩테스트 > 주간코딩 스터디 (주코스)' 카테고리의 다른 글
(Week5)[DP] 정수 삼각형 (0) | 2022.07.07 |
---|---|
(Week5)[DP] N으로 표현 (0) | 2022.07.07 |
(Week4)[완전탐색/순열] 소수 찾기 (0) | 2022.07.07 |
(Week4)[그리디] 큰 수 만들기 (0) | 2022.07.07 |
(Week3)[구현] 순위검색 (0) | 2022.06.20 |