본문 바로가기
알고리즘/백준

기본수학2 (1978, 2581)

by 수쨔앙 2022. 9. 15.

1978

문제 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.
입력 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.
출력 주어진 수들 중 소수의 개수를 출력한다.
def prime_number(x):
    for i in range(2, x):
        if x % i == 0:
            return None
    return x

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

prime_list = []
for i in numbers:
    a = prime_number(i)
    prime_list.append(a)

prime_list = [x for x in prime_list if x]

if 1 in prime_list:
    prime_list.remove(1)
    print(prime_list)

else:
    print(prime_list)

소수의 개수를 어떻게 구하면 좋을까...

일단 2의 배수는 아니고,

홀수중에서 9, 15 이런거는 안되는데 이런걸 어떻게 걸러줘야 되나..

 

일단 소수인지 아닌지 어떻게 판별하는지부터 생각해보자.

9라는 숫자는

1 * 9 = 9,

3 * 3 = 9,

9 * 1 = 9

이렇게 나누어 떨어지는 수가 있으면 소수가 아니다!

1부터 9까지 돌려서 나누어 떨어지는 수가 있으면 소수가 아니다!

 

def prime_number(x):
    for i in range(2, x):
        if x % i == 0:
            return False
    return x

# n = int(input())
# numbers = map(int, input().split())
numbers = [1, 2, 4, 9]
prime_list = []
for i in numbers:
    a = prime_number(i)
    prime_list.append(a)

if 1 in prime_list:
    prime_list.remove(1)
    print(prime_list)

else:
    print(prime_list)

 

이렇게 했는데

답이

[2, False, False]

이런식으로 나온다..! 저 False를 없애고 싶은데ㅜㅜ

return 으로만 하면 None이 나오고return "" 하면 ""이렇게 나오고아예 출력이 안되게하는 방법은 없을까ㅜㅜ팀원분이랑 같이 고민하다가 결국 해결이 안되서 튜터님을 찾아갔다!

 

튜터님께서 이 한줄을 추가하라고 하셨다!

처음에는 잉? 이걸 왜추가하지? 했는데

완전 대박소름... 축약식은 뒤에 조건문이 참일때만 리스트에 추가되니까!!!!!!!!

얏호~~!!~!~! 넘나 시원쓰....

prime_list = [x for x in prime_list if x]

 

입력하니까 바로 성공~

def prime_number(x):
    for i in range(2, x):
        if x % i == 0:
            return None
    return x

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

prime_list = []
for i in numbers:
    a = prime_number(i)
    prime_list.append(a)

prime_list = [x for x in prime_list if x]

if 1 in prime_list:
    prime_list.remove(1)
    print(prime_list)

else:
    print(prime_list)

 

사실 함수 사용안해도 할 수 있긴한데

엊그제 함수를 배워서 써먹어보고 싶었다!! 해결해서 넘나 뿌듯^_^

 

 

 

2581

문제 자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.
예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.
입력 입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.
M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.
출력 M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 
단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
import sys
def prime_number(x):
    for i in range(2, x):
        if x % i == 0:
            return False
    return x

m = int(sys.stdin.readline())
n = int(sys.stdin.readline())
prime_list = []
for i in range(m, n+1):
    a = prime_number(i)
    prime_list.append(a)

prime_list = [x for x in prime_list if x]


if 1 in prime_list:
    prime_list.remove(1)
if len(prime_list) == 0:
    print(-1)
else:
    print(sum(prime_list))
    print(prime_list[0])

 

바로 위에 문제에서 사용했던 소수 구하는 코드를 가져와서 금방 풀었는데

돌리니까 런타임 에러(index error)가 났다....

뭐가 잘못된걸까.....

import sys
def prime_number(x):
    for i in range(2, x):
        if x % i == 0:
            return None
    return x

m = int(sys.stdin.readline())
n = int(sys.stdin.readline())
prime_list = []
for i in range(m, n+1):
    a = prime_number(i)
    prime_list.append(a)

prime_list = [x for x in prime_list if x]
if len(prime_list) == 0:
    print(-1)
else:
    if 1 in prime_list:
        prime_list.remove(1)
        prime_list.sort()
        print(sum(prime_list))
        print(prime_list[0])

    else:
        print(sum(prime_list))
        print(prime_list[0])

 

이렇게 하니까 

0

1

을 입력했을때 오류가 났다

 

IndexError: list index out of range

리스트 범위가 벗어났다는 뜻이다

 

결국 튜터님께 가서 여쭤봤는데 

import sys
def prime_number(x):
    for i in range(2, x):
        if x % i == 0:
            return False
    return x

m = int(sys.stdin.readline())
n = int(sys.stdin.readline())
prime_list = []
for i in range(m, n+1):
    a = prime_number(i)
    prime_list.append(a)

prime_list = [x for x in prime_list if x]


if 1 in prime_list:
    prime_list.remove(1)
if len(prime_list) == 0:
    print(-1)
else:
    print(sum(prime_list))
    print(prime_list[0])

리스트 안에 개수가 0이면 -1, 아니면 1이 들어있는지 확인하고 들어있으면 빼주고 출력하는게 아니고

리스트 안에 1이 들어있으면 1을 빼주고, 개수가 0인지 확인을 해줬다

그랬더니 잘 돌아간다.......... 알다가도 모르겠군....

 

728x90

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

연속합 (1912)  (0) 2023.02.08
기본수학2 (11653, 1929)  (1) 2022.09.16
기본수학1 (10250, 2775, 2839, 10757)  (1) 2022.09.14
기본수학1 (1712, 2292, 1193, 2869)  (0) 2022.09.13
문자열(1152, 2908, 5622, 2941, 1316)  (1) 2022.09.11

댓글