1. 최대공약수와 최소공배수
https://www.acmicpc.net/problem/2609
2609번: 최대공약수와 최소공배수
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
www.acmicpc.net
유클리드 호제법 참고(https://myjamong.tistory.com/138)
a, b = map(int, input().split())
lcm = a*b
while True:
r = a % b #유클리드 호제법
if r == 0:
break
a = b
b = r
gcd = b
lcm /= b #최소공배수 = a * b / 최대공약수
print(gcd)
print(int(lcm))
2. N번째 큰 수
https://www.acmicpc.net/problem/2693
2693번: N번째 큰 수
첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 배열 A의 원소 10개가 공백으로 구분되어 주어진다. 이 원소는 1보다 크거나 같고, 1,000
www.acmicpc.net
t = int(input())
for i in range(t):
a = list(map(int, input().split()))
a.sort(reverse=True)
print(a[2])
3. 소수 찾기
https://www.acmicpc.net/problem/1978
1978번: 소수 찾기
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
www.acmicpc.net
에라토스테네스의 체 활용
import math
n = int(input())
arr = list(map(int, input().split()))
arr.sort()
era = [False, False] + [True]*(arr[-1]-1)
for i in range(2, int(math.sqrt(arr[-1]))+1):
if era[i]:
for j in range(2*i, arr[-1]+1, i):
era[j] = False
answer = 0
for a in arr:
if era[a]:
answer += 1
print(answer)
4. 쉽게 푸는 문제
https://www.acmicpc.net/problem/1292
1292번: 쉽게 푸는 문제
첫째 줄에 구간의 시작과 끝을 나타내는 정수 A, B(1 ≤ A ≤ B ≤ 1,000)가 주어진다. 즉, 수열에서 A번째 숫자부터 B번째 숫자까지 합을 구하면 된다.
www.acmicpc.net
st, ed = map(int, input().split())
edsum = 0
stsum = 0
j = 1
cnt = 0
for i in range(1, ed+1):
edsum += j
cnt += 1
if cnt == j:
j += 1
cnt = 0
if i == st-1:
stsum = edsum
print(edsum - stsum)
https://one-hour.tistory.com/41
x, y = map(int, input().split())
a = []
for i in range(y+1) :
for j in range(i):
if len(a) == y :
break
a.append(i)
print(sum(a[x-1:y]))
5. 소수
https://www.acmicpc.net/problem/2581
2581번: 소수
M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
www.acmicpc.net
다른 사람들은 주로 %연산자를 통해 직접 소수를 체크했던데, 나는 에라토스테네스의 체로 구현했다.
M과 N이 10,000이하의 자연수이기 때문에 최대 10,000개의 소수를 직접 체크해야한다.
이처럼 다수의 소수를 구할때에는 에라토스테네스의 체가 더 적합하다고 생각한다.
직접 소수를 구하는 방법은 구하려는 소수의 개수가 적거나, 체크하려는 수가 매우 커서 배열을 만들 수 없을 때 사용해야 하는 것 같다. (이걸 몰라서 카카오 코테에서 2시간 썼다..)
import math
st = int(input())
ed = int(input())
era = [False, False] + [True]*(ed-1)
primes = []
for i in range(2, int(math.sqrt(ed))+1):
if era[i]:
for j in range(i*2, ed+1, i):
era[j] = False
for i in range(st, ed+1):
if era[i]:
primes.append(i)
if len(primes) == 0:
print(-1)
else:
print(sum(primes))
print(primes[0])
'알고리즘 스터디' 카테고리의 다른 글
[백준] 12865 평범한 배낭 파이썬 (0) | 2021.09.29 |
---|---|
[백준] 13549 숨바꼭질 3 파이썬 (0) | 2021.09.28 |
[백준] 준비운동 Part1. 튼튼한 기본기1 (0) | 2021.09.11 |
[프로그래머스] 그래프 3. 방의 개수 (0) | 2021.09.04 |
[프로그래머스] 이분탐색 2. 징검다리 (0) | 2021.08.26 |