본문 바로가기
알고리즘/백준 solved.ac PS

[백준][solved.ac][Silver 5][Python] 8611번 : 팰린드롬 숫자

by 빛밤하늘 2021. 5. 26.
반응형

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

 

8611번: 팰린드롬 숫자

\(n\)을 \(2, 3, \dots, 10\) 진법으로 나타냈을 때, 팰린드롬인 경우가 없다면, "NIE"를 출력한다. 그 외의 경우에는 팰린드롬이 되는 진법 \(b\)와 \(n\)을 \(b\)진법으로 나타낸 수 \(m\)을 출력한다. 출력은

www.acmicpc.net

 

 

 

 

 

 

 

 

파이썬 코드와 결과입니다.

# readline을 사용하기 위해 import합니다.
from sys import stdin

# 첫째 줄에 n을 입력합니다.
# 1 <= n <= 10^1000
# 정수형으로 변환합니다.
n = int(stdin.readline())
# 팰린드롬이 없는 상태를 저장하는 변수를 선언합니다.
# True로 초기화합니다.
no_palindrome = True

# 2부터 9진법까지 반복해봅니다.
for b in range(2, 10):
    # n의 값을 복사해 온 변수를 선언합니다.
    number = n
    # b진법으로 변환한 결과를 저장할 변수를 선언합니다.
    m = ''

    # number를 b진법으로 변환합니다.
    # number가 b보다 작아질 때까지 반복합니다.
    while number >= b:
        # m에는 number를 b로 나눈 나머지를 넣어줍니다.
        m += str(number % b)
        # number는 b로 나눈 몫으로 다시 초기화해줍니다.
        number //= b
    # 마지막으로 남은 number의 값도 m에 넣어줍니다.
    m += str(number)
    # m에 저장한 b진법으로 변환한 결과는 실제 b진법으로 변환한 결과가 뒤집어진 상태로 저장되어 있습니다.
    # 팰린드롬인지 아닌지 여부만 보면 되므로 한 번 더 뒤집어서 실제 b진법의 결과를 저장할 필요가 없습니다.  

    # m과 m의 역순이 같다면
    if m == m[::-1]:
        # 팰린드롬이 있으므로 no_palindrome에 False를 저장합니다.
        no_palindrome = False
        # 출력 형식에 맞게 현재 진법과 그 진법에서의 결과를 공백을 두고 출력합니다.
        print(f'{b} {m}')

# 10진법일 때의 결과는 입력한 n을 그대로 검사하면 되므로 따로 빼줍니다.
# n과 n의 역순이 같다면
if str(n) == str(n)[::-1]:
    # 출력 형식에 맞게 10과 n을 공백을 두고 출력합니다.
    print(f'10 {n}')
# 이 때까지 팰린드롬이 없었다면 no_palindrome은 True이므로
elif no_palindrome:
    # NIE를 출력합니다.
    print('NIE')

결과

 

첫 번째로 제출했을 때는 입력한 숫자를 b진법으로 변환할 때, 반복문 조건에서 while number >= b:가 아닌

while number > b:로 작성해 틀렸습니다 결과가 나왔습니다.

 

두 번째로 제출했을 때는 실수로 상단의 import문을 빼놓고 제출해버려서 런타임 에러(NameError)가 떴습니다.

 

제출하고 나서 다른 사람들의 파이썬 결과들을 보니 두 자리수의 실행 시간인 코드들이 대부분이었습니다.

실행 시간을 줄이는 법을 공부하고 다시 풀어봐야겠습니다.

 

 

 

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

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

반응형

댓글