본문 바로가기
알고리즘/CodeUp PS

[CodeUp][Python] 1284번 : 암호 해독

by 빛밤하늘 2021. 9. 22.
반응형

밑의 링크는 CodeUp에서의 문제 링크입니다.

문제는 링크를 통해서 직접 봐주시길 바랍니다.

 

암호 해독

어떤 수 n이 입력된다.(단, 1<=n<=10,000,000)

codeup.kr

 

 

 

주의해야 할 점

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')

 

 

제출 결과

CodeUp 1284번 : 암호 해독에서 코드 제출 결과
CodeUp 1284번 : 암호 해독에서 코드 제출 결과

 

 

느낀 점

처음 제출한 코드에서는 2부터 n_limit까지 반복하는 반복문에서 중간에 break를 넣지 않아서

n이 두 소수의 곱으로 나타낼 수 있어도 두 소수를 공백으로 구분해 출력한 것과

마지막에 문자열 'wrong number'를 같이 출력해버렸습니다.

풀었다는 생각으로 이 부분을 고치지 않고 무작정 제출해버려 잘못된 풀이 결과를 보고 말았습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

※ 공감 버튼과 구독 버튼도 잊지 말고 꾹 눌러주시면 감사하겠습니다~👍👍

반응형

댓글