주어진 정수 배열에서 소수만 찾아서 출력하는 프로그램을 작성한다. N의 크기는 0부터 100까지이다.
입력 예시
첫째 줄에 배열의 크기 N이 주어진다. 둘째 줄에 N개의 정수가 공백으로 구분되어 주어진다.
출력 예시
배열에서 소수인 값만 원래 순서대로 공백으로 구분해 출력한다.
예제 테스트케이스
예제 1
6
10 15 17 19 22 23
17 19 23
예제 2
5
2 3 5 7 11
2 3 5 7 11
정답 코드
N = int(input())
arr = []
if N > 0:
arr = list(map(int, input().split()))
result = []
for num in arr:
if num < 2:
continue
is_prime = True
for i in range(2, num):
if num % i == 0:
is_prime = False
break
if is_prime:
result.append(num)
print(*result)
1. 코드 설명
이 코드는 배열을 앞에서부터 하나씩 보면서, 현재 값이 소수인지 검사한 뒤 소수인 값만 result 리스트에 넣고 마지막에 출력하는 방식이다.
배열을 순서대로 확인하면서 조건에 맞는 값만 따로 모으므로, 출력 순서도 입력에서의 등장 순서가 그대로 유지된다.
먼저 첫 줄에서 배열의 크기 N을 입력받는다.
N = int(input())
여기서 input()은 한 줄을 문자열로 입력받고, int()는 그 문자열을 정수로 바꾼다.
즉 이 줄은 입력된 배열 크기를 숫자로 저장하는 역할을 한다.
그다음 배열을 저장할 arr를 먼저 빈 리스트로 만든다.
arr = []
if N > 0:
arr = list(map(int, input().split()))
arr = []는 기본값을 먼저 만들어 두는 부분이다.
이렇게 해 두면 N = 0일 때도 arr가 빈 리스트로 존재하므로, 아래에서 for num in arr:를 써도 오류가 나지 않는다.
그 아래 if N > 0:는 배열 원소가 실제로 있을 때만 둘째 줄 입력을 받겠다는 뜻이다.
input().split()은 입력된 문자열을 공백 기준으로 나누고, map(int, ...)은 나누어진 문자열 각각을 정수로 바꾼다.
마지막으로 list(...)가 그것을 리스트로 만든다.
즉 이 한 줄은 둘째 줄의 정수들을 읽어서 배열로 저장하는 코드이다.
이제 소수만 따로 담을 result 리스트를 만든다.
result = []
이 리스트는 최종적으로 소수만 저장하는 역할을 한다.
그다음 배열의 각 원소를 하나씩 꺼내면서 소수인지 검사한다.
for num in arr:
for문은 리스트의 값을 앞에서부터 하나씩 꺼내 반복하는 문법이다.
여기서는 arr 안의 각 숫자가 차례대로 num에 들어간다.
이제 본격적으로 소수 판별을 시작한다.
소수는 1보다 큰 수 중에서 1과 자기 자신만 약수로 가지는 수이므로, 0, 1, 음수는 바로 제외해야 한다.
if num < 2:
continue
if문은 조건이 참일 때만 실행되는 문법이고, continue는 현재 반복을 건너뛰고 다음 반복으로 넘어가는 문법이다.
즉 num < 2이면 더 검사할 필요가 없으므로 바로 다음 숫자로 넘어간다.
그다음에는 현재 수를 일단 소수라고 가정하고 시작한다.
is_prime = True
여기서 is_prime은 불리언 변수이다.
불리언 변수는 True 또는 False 둘 중 하나의 값만 저장하는 변수인데, 이 코드에서는 “현재 숫자가 소수인지 아닌지”를 기록하는 역할을 한다.
처음에는 아직 약수를 찾지 못했으므로 True로 시작한다.
이제 2부터 num - 1까지의 수로 하나씩 나누어 본다.
for i in range(2, num):
if num % i == 0:
is_prime = False
break
여기서 range(2, num)은 2부터 num - 1까지의 정수를 차례대로 만든다.
즉 현재 숫자 num을 2, 3, 4, ...로 나누어 보겠다는 뜻이다.
num % i == 0에서 %는 나머지 연산자이다.
어떤 수를 나누었을 때 나머지가 0이면 나누어떨어진다는 뜻이다.
그 말은 num이 i라는 약수를 가진다는 뜻이므로, 소수가 아니다.
그래서 약수를 하나라도 찾으면
is_prime = False
로 바꾸고,
break
로 반복문을 즉시 끝낸다.
break는 현재 반복문을 바로 종료하는 문법이다. 약수를 하나 찾은 순간 이미 소수가 아니라는 것이 확정되므로 더 볼 필요가 없다.
예를 들어 num = 17이면 2부터 16까지 나누어 봐도 하나도 나누어떨어지지 않는다.
따라서 is_prime은 끝까지 True로 남고, 17은 소수이다.
반대로 num = 15이면 3으로 나누어떨어진다.
15 % 3 == 0
이 순간 is_prime = False가 되고, 15는 소수가 아니라고 판정된다.
이 검사가 끝난 뒤 is_prime이 여전히 True이면 현재 수는 소수이므로 결과 리스트에 넣는다.
if is_prime:
result.append(num)
여기서 append()는 리스트 맨 뒤에 값을 추가하는 메서드이다.
즉 소수라고 판정된 숫자만 result에 차례대로 저장하는 역할을 한다.
마지막으로 소수들만 들어 있는 result를 출력한다.
print(*result)
print(*result)는 리스트의 원소를 하나씩 꺼내 공백으로 구분하여 출력하는 방식이다.
그래서 [17, 19, 23] 같은 리스트를 문제에서 요구한 형식인
17 19 23
처럼 출력할 수 있다.
예를 들어 입력이 다음과 같다면
6
10 15 17 19 22 23
배열을 앞에서부터 검사한 결과
- 10은 2로 나누어떨어지므로 소수 아님
- 15는 3으로 나누어떨어지므로 소수 아님
- 17은 끝까지 약수가 없으므로 소수
- 19는 소수
- 22는 2로 나누어떨어지므로 소수 아님
- 23은 소수
가 되어 result = [17, 19, 23]이 되고, 최종 출력은 다음과 같다.
17 19 23
2. 실수하기 쉬운 부분
1을 소수로 처리하는 경우
# 잘못된 코드
if num == 1:
result.append(num)
1은 소수가 아니므로 결과에 넣으면 안 된다.
약수를 찾았는데 소수라고 처리하는 경우
# 잘못된 코드
if num % i == 0:
result.append(num)
나누어떨어진다는 것은 약수가 있다는 뜻이므로, 오히려 소수가 아니다.
is_prime을 반복문 밖에서 한 번만 만드는 경우
# 잘못된 코드
is_prime = True
for num in arr:
for i in range(2, num):
if num % i == 0:
is_prime = False
is_prime은 숫자 하나를 검사할 때마다 새로 시작해야 하므로 for num in arr: 안에서 매번 다시 True로 만들어야 한다.
정수를 바로 반복하려는 경우
# 잘못된 코드
for i in num - 1:
num - 1은 숫자 하나이므로 반복할 수 없고, range(2, num)처럼 범위를 만들어야 한다.
리스트를 그대로 출력하는 경우
# 잘못된 코드
print(result)
이렇게 하면 [17, 19, 23]처럼 출력되어 문제의 공백 출력 형식과 다르다.
3. 핵심 정리
이 문제는 배열을 앞에서부터 보면서 각 수가 소수인지 판별하고, 소수인 경우만 결과 리스트에 넣어 출력하면 된다.
핵심은 is_prime이라는 불리언 변수로 현재 숫자의 상태를 기록하면서, 2부터 num - 1까지 나누어 보다가 약수가 하나라도 나오면 제외하고 끝까지 없을 때만 소수로 처리하는 것이다.
'Univ > Python Programming' 카테고리의 다른 글
| [문제 04] 별로 다이아몬드 그리기 - Python 풀이 (0) | 2026.04.18 |
|---|---|
| [문제 17] 두 문자열의 공통 문자 찾기 - Python 풀이 (0) | 2026.04.17 |
| [문제 15] 문자열에서 모음과 자음 세기 - Python 풀이 (1) | 2026.04.16 |
| [문제 14] 배열에서 짝수와 홀수 구분하기 - Python 풀이 (0) | 2026.04.16 |
| [문제 13] 문자열 뒤집기와 대소문자 변경 - Python 풀이 (1) | 2026.04.15 |