일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 프로토타입
- html
- javascript
- superstarjypnation
- 30daysdowoonchallenge
- Til
- REST_API
- web
- 해시테이블
- UX
- 회고
- vercel
- mysemester
- 자료구조
- React
- redux
- 자바스크립트
- 생활코딩
- level1
- 카카오
- Next.js
- 코드스테이츠
- 운영체제
- 스택
- 큐
- useState
- 백준
- UI
- CSS
- 프로그래머스
- Today
- Total
데굴데굴
[파이썬] 9020번: 골드바흐의 추측 본문
9020번: 골드바흐의 추측
1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아
www.acmicpc.net
소수: 1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수
골드바흐의 추측: 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다.
이러한 수를 골드바흐 수라고 함.
두 소수의 합으로 나타내는 표현을 골드바흐 파티션이라고 함.
10000보다 작거나 같은 모든 짝수 n에 대한 골드바흐 파티션은 존재함.
2보다 큰 짝수 n이 주어졌을 때 n의 골드바흐 파티션을 출력하는 프로그램 작성
만약 파티션이 여러 가지인 경우에는 두 소수의 차이가 가장 작은 것을 출력.
소수 판별 함수 정의 -> 문제에 정의된 범위 내에서 소수만 따로 골라냄 -> prime이라는 리스트에 저장
이렇게 해두고 n을 입력받은 후에 prime 리스트의 원소를 어떻게 해서 결과를 구해보려고 했는데 머리가 도저히 돌아가지를 않아서 결국엔 구글링했다.
참고링크: [백준] 9020 골드바흐의 추측(실버1) - Python (velog.io)
# 소수 판별 함수
def sosu(n):
if n == 1:
return False
for i in range(2, int(n**0.5 + 1)):
if n % i == 0:
return False
return True
for _ in range(int(input())): # 테스트케이스를 이렇게 입력받을 수도 있음!
n = int(input())
a, b = n // 2, n // 2 # 입력받은 n을 반으로 쪼개 각각 a, b에 저장
while a > 0:
if sosu(a) and sosu(b): # a와 b 둘 다 소수일 경우에 출력
print(a, b)
break # break문을 안 넣었더니 반복문이 무한으로 출력되었음
else:
a -= 1 # 문제에서 작은 소수부터 출력하라고 했으므로 a는 1을 빼고, b는 1을 더한다.
b += 1
소수를 따로 리스트에 저장해둘 필요가 없었다!
n을 반으로 쪼개서 a와 b에 나누어 저장한 후 각각이 소수인지 판별하면 더 간단하다.
항상 테스트케이스 입력받을 때 맨 윗줄에 t = int(input())을 입력했었는데 range 자체에 int(input())을 지정해줄 수 있다는 것도 배웠다.
'algorithm > 백준' 카테고리의 다른 글
[파이썬] 10870번: 피보나치 수 5 (0) | 2022.06.14 |
---|---|
[파이썬] 10872번: 팩토리얼 (0) | 2022.06.14 |
[파이썬] 4948번: 베르트랑 공준 (0) | 2022.06.12 |
[파이썬] 1929번: 소수 구하기 (0) | 2022.04.20 |
[파이썬] 2581번: 소수 (0) | 2022.04.07 |