[구현] 소수의 연속합 - 소수 판별 (에라토스테네스의 체)

알고리즘/백준
2024. 8. 21. 14:49
목차
  1. ✅ 에라토스테네스의 체
  2. 알고리즘 설명
  3. 🔴 틀린 코드
  4. 🟢정답 코드
728x90

이 문제의 핵심은 소수를 어떻게 효율적으로 찾을것인가 문제였던거 같다..

✅ 에라토스테네스의 체

알고리즘 설명

🔹2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
🔹2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)자기 자신을 제외한 2의 배수를 모두 지운다.
🔹남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)자기 자신을 제외한 3의 배수를 모두 지운다.
🔹남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)자기 자신을 제외한 5의 배수를 모두 지운다.
🔹남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)자기 자신을 제외한 7의 배수를 모두 지운다.
🔹위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다. (보라색)

 

🔴 틀린 코드

에라토스테네스의 체 알고리즘과는 조금 다르지만

백준 질문 게시판에서 코드를 참고해서 소수를 구하기는 했는데 IndexError가 났다.

#소수의 합으로 나타낼 수 있는 경위의수
import sys
n = int(sys.stdin.readline().rstrip())
#소수 찾아서 배열에 저장 -> 이게 시간초과의 원인이였음 소수를 어떻게 효율적으로 찾을것인가...
primes = [False, False] + [True] * (n-1)
data = []
for i in range(2, n+1):
if primes[i]:
data.append(i)
j = 2
while i*j <= n:
primes[i*j] = False
j += 1
start, end = 0, 0
total = data[start]
cnt = 0
while start <= end and end < len(data):
if total == n: #start 포인터 이동해서 다른 구간도 가능한지 검사
total -= data[start]
start += 1
cnt += 1
elif total < n:
end += 1 #end 포인터가 가리키는 요소도 포함
if end >= len(data):
break
total += data[end]
elif total > n:
total -= data[start]
start += 1
print(cnt)

 

🟢정답 코드

while 반복문 조건과 total 값을 0으로 초기화했더니 IndexError 해결...

#소수의 합으로 나타낼 수 있는 경위의수
import sys
n = int(sys.stdin.readline().rstrip())
#소수 찾아서 배열에 저장 -> 이게 시간초과의 원인이였음 소수를 어떻게 효율적으로 찾을것인가...
primes = [False, False] + [True] * (n-1)
data = []
for i in range(2, n+1):
if primes[i]:
data.append(i)
j = 2
while i*j <= n:
primes[i*j] = False
j += 1
start, end = 0, 0
total = 0
cnt = 0
while start <= end:
if total == n: #start 포인터 이동해서 다른 구간도 가능한지 검사
total -= data[start]
start += 1
cnt += 1
elif total < n:
if end >= len(data):
break
total += data[end]
end += 1
elif total > n:
total -= data[start]
start += 1
print(cnt)

ref: https://ko.wikipedia.org/wiki/%EC%97%90%EB%9D%BC%ED%86%A0%EC%8A%A4%ED%85%8C%EB%84%A4%EC%8A%A4%EC%9D%98_%EC%B2%B4

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

케빈 베이컨의 6단계 법칙  (3) 2024.10.05
구간 합 구하기 5  (3) 2024.10.01
[그리디] 단어 수학  (0) 2024.08.09
이코테 [구현] 백준3190 뱀  (1) 2024.07.20
설탕 배달 (파이썬)  (0) 2024.06.29
  1. ✅ 에라토스테네스의 체
  2. 알고리즘 설명
  3. 🔴 틀린 코드
  4. 🟢정답 코드
'알고리즘/백준' 카테고리의 다른 글
  • 케빈 베이컨의 6단계 법칙
  • 구간 합 구하기 5
  • [그리디] 단어 수학
  • 이코테 [구현] 백준3190 뱀
hapBday
hapBday
hapBday
개발자로 성장하기 위한 기록들
hapBday
전체
오늘
어제
  • 분류 전체보기 (203) N
    • CS (12)
      • 컴퓨터네트워크 (11)
      • 운영체제 (0)
      • 분산 시스템 (0)
      • 데이터베이스 (1)
    • Spring (47)
      • Spring 핵심 원리 (13)
      • Spring MVC (15)
      • Spring DB (12)
      • Spring Security (6)
    • JPA (14)
    • 알고리즘 (30)
      • 프로그래머스 (6)
      • 백준 (20)
    • Design Pattern (0)
    • 언어 (5)
      • JAVA (5)
    • ASAC 웹 풀스택 (38)
      • Spring Boot (21)
      • React (0)
      • DevOps (8)
    • 트러블슈팅 (15)
    • DevOps (5)
      • Docker (5)
    • ETC (2) N

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • github

공지사항

인기 글

태그

  • 트랜잭션
  • 오블완
  • S3
  • 티스토리챌린지
  • 프로그래머스
  • Java
  • CORS
  • docker
  • Session
  • multi-stage
  • x-lock
  • MVC
  • s-lock
  • basicerrorcontroller
  • docker best practices
  • 인프런
  • aws lambda
  • 구현
  • currency control
  • 3-layerd 아키텍쳐 패턴
  • docker workflow
  • 백준
  • spring boot
  • 김영한
  • cookie
  • jwt
  • Spring
  • CSRF
  • JPA
  • spring security

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
hapBday
[구현] 소수의 연속합 - 소수 판별 (에라토스테네스의 체)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.