-
약수와 배수 - 백준 1929Code Etc/코딩테스트 2023. 3. 14. 14:51반응형
약수와 배수 파트이다.
여기서는 약수와 배수를 빠르게 구하는 방법 그리고 소수를 구하는 일이 주된 문제였다
주로 사용한 알고리즘은 유클리드 호제법이랑 소수를 구하는 알고리즘이였는데
유클리드 호제법은 전에 공부했었기 때문에 재귀함수로 쉽게 풀어냈다.
그리고 소수를 구하는 문제들을 풀다가 에라토스테네스의 채라는 것을 알았다.
일정 범위 내에 있는 소수의 갯수를 빠르게 찾는 방법인데 사용법은 이렇다
num = 100 arr = [False,False] + [True]*(num-1) for i in range(2,num - 1) : if arr[i] : for j in range(2 * i, num, i) arr[j] = False
0부터 100까지의 수를 소수이면 True 아니면 False를 갖는 배열 arr을 만들었다.
원리는 이렇다 소수의 배수들은 전부 소수가 아니므로 False로 바꿔준다.
이렇게하면 arr에는 소수를 판별한 배열이 만들어지고 인덱스를 호출하면 소수인지 아닌지 알 수 있다.
이게 가장 빠른 방법이라고 해서 이를 사용한 풀이도 있지만 나는 소수를 판별하는 함수를 만들어
주어진 범위를 순회하면서 정답을 해결했다.
https://www.acmicpc.net/problem/1929
1929번: 소수 구하기
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000) M이상 N이하의 소수가 하나 이상 있는 입력만 주어진다.
www.acmicpc.net
백준 1929번 문제가 에라토스테네스의 채를 사용하면 쉽게 풀 수 있다.
나는 다르게 풀었으니 내가 푼 풀이는 아래 코드를 참고하시길~!~
import math m,n = map(int,input().split()) def Prime(num) : if num == 1 or num == 1: return False half = math.sqrt(num) isPrime = True for i in range(2,int(half) + 1) : if num % i == 0 : isPrime = False break if isPrime == True : return True else : return False result = [] for i in range(m,n+1) : isPrime = Prime(i) if isPrime == True : result.append(i) print(*result,sep='\n')
반응형'Code Etc > 코딩테스트' 카테고리의 다른 글
백트래킹 - 백준 9663, 2580, 14888, 14889 (0) 2023.03.24 기하 1 - 백준 2477, 1002, 1004 (0) 2023.03.16 재귀함수 - 백준 24060, 2447, 11729 (3) 2023.03.11 집합과 맵 - 백준 10815, 1620 파이썬 풀이 (0) 2023.03.09 브루트 포스 완전 탐색 문제 - 백준 1018,1436 (0) 2023.03.08