Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions jaykxo/week08/2960_에라토스테네스의_체.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# 2960 에라토스테네스의 체
# Python3, 메모리: 32412 KB, 시간: 32 ms
# PyPy3, 메모리: 109544 KB, 시간: 88 ms

import sys
input = sys.stdin.readline

N, K = map(int, input().split())

prime = [True] * (N + 1)
cnt = 0

for i in range(2, N + 1):

# 아직 지우지 않은 수 중 가장 작은 수를 찾는다 → 이 수가 P이다 (소수)
if prime[i]:
for j in range(i, N + 1, i):
if prime[j]:
# 아직 지우지 않은 P의 배수를 크기 순서대로 지운다
prime[j] = False
cnt += 1
if cnt == K: # K번째로 지워진 수를 찾으면 출력
print(j)
raise SystemExit
50 changes: 50 additions & 0 deletions jaykxo/week08/3020_개똥벌레.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# 3020 개똥벌레
# Python3, 메모리: 71968 KB, 시간: 436 ms
# PyPy3, 메모리: 118544 KB, 시간: 144 ms

import sys
input = sys.stdin.readline

N, H = map(int, input().split())

# 석순과 종유석의 길이 빈도를 저장할 배열
# 인덱스 = 장애물의 길이, 값 = 해당 길이 장애물 개수
# +2 여유 공간은 인덱스 범위 오류 방지용
down = [0] * (H + 2) # 석순(바닥에서 위로)
up = [0] * (H + 2) # 종유석(천장에서 아래로)

# 장애물 길이 입력 받기
for i in range(N):
L = int(input())
if i % 2 == 0:
# 짝수 번째는 석순
down[L] += 1
else:
# 홀수 번째는 종유석
up[L] += 1

# 누적합으로 변환
# down[h] = 높이 h 이상인 석순의 개수
# up[h] = 길이 h 이상인 종유석의 개수
# → 뒤에서부터 누적해야 “길이 이상(≥)” 형태의 합
for h in range(H - 1, 0, -1):
down[h] += down[h + 1]
up[h] += up[h + 1]

# 각 높이 h(1 ~ H)에서의 충돌 개수 계산
min_hit = N + 1 # 최소 충돌 횟수: 초기값 충분히 크게 설정
count_min = 0 # 최소 충돌이 발생하는 높이 개수

for h in range(1, H + 1):
# 석순은 높이 h 이상일 때 충돌
# 종유석은 천장에서 내려오므로 (H - h + 1) 이상일 때 충돌
hit = down[h] + up[H - h + 1]

# 최솟값 갱신
if hit < min_hit:
min_hit = hit
count_min = 1 # 새 최솟값이 나왔으니 개수 1로 초기화
elif hit == min_hit:
count_min += 1 # 같은 최솟값이 또 나왔으니 개수 +1

print(min_hit, count_min)
45 changes: 45 additions & 0 deletions jaykxo/week08/6588_골드바흐의_추측.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# 6588 골드바흐의 추측
# Python3, 시간 초과........
# PyPy3, 메모리: 130980 KB, 시간: 440 ms

import sys
input = sys.stdin.readline

MAX_N = 1_000_000 # 문제 제한: n ≤ 1,000,000 → 한 번만 체를 만들어 재사용

# --- [준비 단계] 에라토스테네스의 체로 0~MAX_N까지 소수 여부 미리 계산 ---
prime = [True] * (MAX_N + 1)
prime[0] = prime[1] = False

# i가 소수(True)면 i*i부터 i의 배수들을 소수 아님(False)으로 표시
# - i*i 이전의 배수들은 더 작은 소수에서 이미 처리됨(중복 제거를 위한 최적화)
for i in range(2, int(MAX_N ** 0.5) + 1):
if prime[i]:
for j in range(i * i, MAX_N + 1, i):
prime[j] = False

# --- [입력 & 처리] 여러 줄의 짝수 n을 받으며, 0이 나오면 종료 ---
result = []
while True:
n = int(input())
if n == 0: # 종료 신호
break

# --- [골드바흐 쌍 탐색] n = a + b (a, b 모두 소수) ---
# 탐색 전략:
# 1) a ≤ b만 보면 충분 → a는 3부터 n//2까지
# 2) 2를 제외하면 짝수는 소수가 아니므로, a는 홀수만 확인(3,5,7,...) → step=2
# 3) b는 n - a 로 자동 결정되므로, prime[a]와 prime[b]만 빠르게 체크
found = False
for a in range(3, (n // 2) + 1, 2):
b = n - a
if prime[a] and prime[b]: # 두 수가 모두 소수면 골드바흐 표현 성립
result.append(f"{n} = {a} + {b}")
found = True
break # 가장 먼저 찾은 한 쌍을 출력 형식대로 사용

# 문제 형식상 항상 존재한다고 가정하지만, 못 찾으면 아래 문구 출력
if not found:
result.append("Goldbach's conjecture is wrong.")

print('\n'.join(result))