백준 알고리즘 연습 : 약수, 배수와 소수

2024. 12. 4. 20:11Algorithms/백준알고리즘 연습

5086번 

초기 코드

a, b = map(int,(input().split()))
if b % a == 0:
    print('factor')
elif a % b == 0 :
    print('multiple')
else :
    print('neither')

마지막 0 이 주어지면 프린트를 안하게 되는 방법을 모르겠다 

다른분 코드 

while (1):
    x,y = map(int,input().split())
    
    if x==0 and y==0:
        break
        
    if x<y and y%x==0:
        print("factor")
    elif x>y and x%y==0:
        print("multiple")
    else:
        print("neither")

 

x와 y가 0일때 출력하지 않게 하는 방법은 코드가 안돌아가게 하면 되는 것 

그리고 약수와 배수는 서로 작거나 클때 의 조건에서 성립하기 때문에, 앞에 무엇이 더 클때 어떻게 비교할건지를 만들어주어야 함

조그마한 조건도 놓치지 말자 

 

2501번

약수 구하기

n, k = map(int,input().split())
ans = []
for i in range (1, n+1):
    if n % i == 0 :
        ans.append(i)
        
print(ans[k-1])

jupyter 에서 돌리면 되는데, 백준에서는 index오류가 난다

왤까?

정답 코드 

n, k = map(int, input().split())
ans = []

for i in range(1, n+1):
    if n % i == 0:
        ans.append(i)

if k <= len(ans):
    print(ans[k-1])
else:
    print(0)

출력

첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오. (이 부분을 코딩을 안함)

 

9506 번

약수들의 합

초기 코드

n = int(input())
while n>0 :
    ans = []
    for i in range (1, n):
        if n % i == 0 :
            ans.append(i)


    if sum(ans) == n:
        print(f"{n} = {' + '.join(map(str, ans))}")
    else:
        print(n, 'is NOT perfect.')

정답 아니래...

저렇게 프린트 하느 방법을 몰랐음

while True:
    n = int(input())
    if n == -1: # 입력 값이 -1이면 반복문 종료
        break;
    ans = []
    for i in range (1, n):
        if n % i == 0 :
            ans.append(i)


    if sum(ans) == n:
        print(f"{n} = {' + '.join(map(str, ans))}")
    else:
        print(n, 'is NOT perfect.')

while 문 이용할거면 저렇게 제외사항 먼저 써두어도 괜찮음 

 

1978번 소수찾기

n = int(input())
b = list(map(int,input().split()))
ans = 0

for _ in range (n):
    if b % 2 != 0 and b % 3 !=0 :
        ans += 1

print(ans)

type error 뜸

 

답안

1은 소수에서 없어야 함

n = int(input())
b = list(map(int, input().split()))
ans = 0

for num in b:
    if num > 1:  # Prime numbers are greater than 1
        is_prime = True
        for i in range(2, int(num**0.5) + 1):  # Check divisors up to the square root of num
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            ans += 1

print(ans)

 

다른분 코드 

n = int(input())
data = list(map(int, input().split()))
count = 0

for x in data:
  for i in range(2, x+1):
    if x % i == 0:
      if x == i:
        count += 1
      
      break

출처 : https://seongonion.tistory.com/39

 

[백준] 1978번 소수 찾기 - 파이썬(Python)

문제 (링크) https://www.acmicpc.net/problem/1978 1978번: 소수 찾기 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다. www.acmicpc.net 나의 풀이

seongonion.tistory.com

주어진 수를 2부터 해당 숫자까지 for 문으로 돌면서 x와 나누어 떨어지는지 (자기자신) 

그러다가 자기 자신이 아닌 다른 수와 나누어 떨어지면 그것은 소수가 아니기에 break로 간다 

 

백준 2581번 소수

n=64
m=65
count = []

for x in range(n,m+1):
  for i in range(2, x+1):
    if x % i == 0:
        if x == i:
        count.append(x)
   

        else :
        print('-1')
    
      break

print(sum(count))
print(min(count))

출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

 

항상 그게 아니라면 어떤 것을 출력한다 라는 조건을 실행하는 것을 어려워하는 중

 

다른 분 답변

start_num = int(input())
last_num = int(input())

sosu_list = []
for num in range(start_num, last_num+1):
    error = 0
    if num > 1 :
        for i in range(2, num):  # 2부터 num-1까지
            if num % i == 0:
                error += 1
                break  # 2부터 num-1까지 나눈 몫이 0이면 error가 증가하고 for문을 끝냄
        if error == 0:
            sosu_list.append(num)  # error가 없으면 소수리스트에 추가
            
if len(sosu_list) > 0 :
    print(sum(sosu_list))
    print(min(sosu_list))
else:
    print(-1)

출처 :

https://ooyoung.tistory.com/93

 

백준 2581 [파이썬] 소수

[Python] 백준 알고리즘 온라인 저지 2581번 : 소수 Python3 코드 start_num = int(input()) last_num = int(input()) sosu_list = [] for num in range(start_num, last_num+1): error = 0 if num > 1 : for i in range(2, num): # 2부터 num-1까지 if n

ooyoung.tistory.com

 

 

11653번 소인수분해

로직펼치기

1. 먼저 2로 나누어야 함으로 나눌 변수를 선언하고 2로 할당

2. 입력받은 수를 2로 나눈다. 안나눠진다면 나눌 수를 1로 올린다.

3. 나누어진다면 또 나누어지는지 확인한다

4. 계속 나누어질때까지 반복한다.

5. 문제 조건에서 1을 입력받으면 아무것도 출력하지말라했으니 1일때 break를 넣어준다 

 

n = int(input())
d = 2

while num>1:
	if n % d == 0 :
    	print(d)
        n = n//d
    else :
    	d += 1
        if d > int(n%%0.5): #루트로만들기
        d = n

 

if divisor > int(num**0.5)에 대해서 설명을 하자면 약수는 쌍으로 존재하기 때문에 약수 확인을 √N 이상에 대해 할 이유가 없다는 것이다. 그래서 √N (즉,int(num**0.5))을 divisor가 넘으면 남은 수 자체가 소수이기 때문에 아예 divisor=num으로 처리

출처: https://aaaaaaaaaaayowooji.tistory.com/18 

 

'Algorithms > 백준알고리즘 연습' 카테고리의 다른 글

백준 기하  (0) 2024.12.07
백준  (1) 2024.12.05
백준 일반 수학 1  (0) 2024.12.04
백준 2차원 배열  (0) 2024.12.02
백준 심화 1  (2) 2024.12.01