Coding Test/Python

[4월 - 코딩테스트] 정수론 문제모음

민듀키티 2024. 5. 2. 12:40

 

1. 소수 구하기

  • 에라토스테네스의 채 원리 : 구하고자 하는 소수의 범위만큼 1차원 리스트 생성 -> 2부터 시작하고 현재 숫자가 지원진 상태가 아닌 경우 현재 선택된 숫자의 배수에 해당하는 수를 리스트에서 끝까지 탐색하면서 지움 -> 리스트 끝까지 반복한 후 리스트에 남아있는 수 출력
  • for 문을 돌면서 이미 소수가 아니라고 판별된 것 ( A[i] == 0 ) 인 것은 continue로 건너뛰고
  • for i in range(i+i, m+1, i) 코드를 통해 배수를 계속해서 지워나감
  • 마지막으로 0 이 아닌 것은 출력하기 
import math
# 에라토스테네스의 체 원리 이용
n,m = map(int, input().split())
A = [0] * (m+1)

for i in range(2,m+1) :
    A[i] = i

for i in range(2, int(math.sqrt(m)) + 1) :
    if A[i] == 0 :
        continue  # 0일 경우 코드 시행 건너뛰기
    for j in range(i+i, m+1, i) : # 배수 지우기
        A[j] = 0

for i in range(n,m+1) :
    if A[i] != 0 :
        print(A[i])

 


 

2. 소수&팰린드롬 수 중에서 최솟값 찾기

# 소수&팰린드롬
import math
n=int(input())

# 소수 리스트 만들기
A = [0] * 1000001

for i in range(2,len(A)) :
    A[i]=i

for i in range(2, int(math.sqrt(len(A)))+1) :
    if A[i] == 0 :
        continue
    for j in range(i+i,len(A),i) :
        A[j] = 0

# 팰린드롬 판별 함수
def isPalinrome(target) :
    temp = list(str(target))
    s = 0
    e = len(temp) -1
    while s<e :
        if temp[s] != temp[e] :
            return False
        else :
            s += 1
            e -= 1

    return True

i = n

while True :
    if A[i] != 0 :
        result = A[i]
        if isPalinrome(result) :
            print(result)
            break
        i += 1

 


 

3. 소수 찾기

https://www.acmicpc.net/problem/1978

import math
def number(n) :
    for i in range(2,int(math.sqrt(n)) + 1 ) :
        if n%i == 0:
            return False
    if n == 1 :
        return False
    return True


# 입력받기
n = int(input())
A = list(map(int, input().split()))
count = 0
for i in range(n) :
    if number(A[i]) :
        count +=1
print(count)

 

 


4. 최대공약수와 최소공배수

  • 유클리드 호제법을 이용한 풀이
  • 그냥 유클리드 호제법을 이용해서 최대공약수, 최소공배수 구하는 방법을 거의 암기하고 싶이 알고있으니 구현이 매우 쉬웠다. 

https://www.acmicpc.net/problem/2609

n,m = map(int, input().split())

def gcd(a,b) :
    if b == 0 :
        return a
    else :
        return gcd (b, a%b)

# 최대공약수
print(gcd(n,m))
# 최소공배수
print(int((n*m) / (gcd(n,m))))

 


5. 최소공배수

https://www.acmicpc.net/problem/1934

def gcd(a,b):
    if b == 0:
        return a
    else :
        return gcd(b, a%b)


t = int(input())
for i in range(t):
    n,m = map(int, input().split())
    print(int((n*m)/(gcd(n,m))))

 


 

6. 소인수분해

https://www.acmicpc.net/problem/11653

def numbers(n) :
    i = 2
    A = list()
    while i <= n :
        if n%i == 0 :
            A.append(i)
            n = n/i
        else :
            i = i+1

    return A

n = int(input())
k = numbers(n)

for i in k :
    print(i)