반응형
밑의 링크는 CodeUp에서의 문제 링크입니다.
문제는 링크를 통해서 직접 봐주시길 바랍니다.
주의해야 할 점
1. readline과 int나 float를 사용하는 입력 방식
readline을 사용해서 입력할 때는 맨 끝에 \n이 붙어서 입력됩니다.
하지만, 입력한 값을 int나 float으로 처리해 정수, 실수형으로 만들어 줄 때는
굳이 \n을 떼기 위해 rstrip을 사용할 필요가 없습니다.
숫자 형태를 만들어줄 때 자동으로 사라집니다.
num = int(sys.stdin.readline())
2. 소수인지 아닌지를 판별하는 방법
어떤 숫자가 소수인지 아닌지를 판별할 때는 어떤 숫자를 2부터 어떤 숫자의 제곱근의 정수 부분까지의 숫자로
나누어 봤을 때, 하나도 딱 나누어 떨어지지 않는다면, 그 어떤 숫자는 소수입니다.
말로만 설명하려고 하니까 어렵네요.
소수를 판별하는 방법에 대해서도 정리해서 포스팅해봐야겠습니다.
예제 설명
1. 첫 번째 예제
- 입력
21
- 출력
3 7
- 설명
입력한 어떤 수 n은 21입니다.
21은 소수인 3 X 7로 나타낼 수 있습니다.
따라서 3 7을 출력합니다.
제출한 파이썬 코드
# readline을 사용하기 위해 import합니다.
from sys import stdin
# 매개변수 num의 값이 소수인지를 판별하는 함수를 만들어봅니다.
def isPrime(num):
# num의 값이 소수인지를 판별하기 위해 2부터 num의 제곱근까지의 값이 필요합니다.
# 그래서 num의 제곱근의 정수 부분만 가져오고 그 값에 1을 더한 값을 변수 limit에 저장합니다.
limit = int(num ** 0.5) + 1
# 2부터 limit - 1 값까지 반복해봅니다.
for i in range(2, limit):
# num의 값이 현재 숫자로 나누어 떨어진다면, 즉 num의 값을 현재 숫자로 나누었을 때 나머지가 0이라면
if num % i == 0:
# num은 소수가 아니므로 False를 반환합니다.
return False
# 2부터 limit - 1 값까지 반복했는데 나누어 떨어진 숫자가 하나도 없다면
else:
# True를 반환합니다.
return True
# 어떤 수 n을 입력합니다.
# 1 <= n <= 10,000,000
# int형으로 변환합니다.
n = int(stdin.readline())
# 어떤 수 n이 두 소수의 곱으로 나타낼 수 있는지 여부는 n의 제곱근까지의 수로 나누어보고,
# 나눈 수와 나누고 나온 값이 둘 다 소수인지 판별하면 됩니다.
# 입력한 n의 제곱근에 1을 더한 값을 구해 변수 n_limit에 저장합니다.
n_limit = int(n ** 0.5) + 1
# 2부터 n_limit - 1 값까지 반복해봅니다.
for num in range(2, n_limit):
# n의 값을 현재 숫자로 나누었을 때 나머지가 0이고,
# 현재 숫자와 n을 현재 숫자로 나누었을 때 몫이 모두 소수라면
if n % num == 0 and isPrime(num) and isPrime(n // num):
# 입력한 n은 두 소수의 곱인 현재 숫자 num과 n // num으로 나타낼 수 있습니다.
# 따라서 num과 n // num의 값을 공백으로 구분해 출력합니다.
print(num, n // num)
# n을 두 소수의 곱으로 나타냈으므로 반복문을 탈출합니다.
break
# 2부터 n_limit - 1 값까지 반복해도 중간에 반복문을 탈출하지 않았다면
else:
# n을 두 소수의 곱으로 나타낼 수 없으므로 문자열 'wrong number'을 출력합니다.
print('wrong number')
제출 결과
느낀 점
처음 제출한 코드에서는 2부터 n_limit까지 반복하는 반복문에서 중간에 break를 넣지 않아서
n이 두 소수의 곱으로 나타낼 수 있어도 두 소수를 공백으로 구분해 출력한 것과
마지막에 문자열 'wrong number'를 같이 출력해버렸습니다.
풀었다는 생각으로 이 부분을 고치지 않고 무작정 제출해버려 잘못된 풀이 결과를 보고 말았습니다.
※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.
※ 더 효율적이고 빠른 정답을 환영합니다.
※ 공감 버튼❤과 구독 버튼도 잊지 말고 꾹 눌러주시면 감사하겠습니다~👍👍
반응형
댓글