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인지 확인을 해줬다
그랬더니 잘 돌아간다.......... 알다가도 모르겠군....
'알고리즘 > 백준' 카테고리의 다른 글
연속합 (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 |
댓글