카테고리 없음

[백준/Python] 14561번 : 회문

4lph4 2024. 7. 28. 23:53

문제

https://www.acmicpc.net/problem/14561

n진수는 base가 n인 수를 말한다. 예를 들어 십진수는 base가 10인 수이다. n진수의 수 AmAm-1Am-2…A1A0를 n진수로 표현해보면 AmAm-1Am-2…A1A0 = Am × nm + Am-1 × nm–1 + Am-2 × nm–2 + … + A1 × n1 + A0 × n0이다. 예를 들면, 12468은 12468 = 1 × 104 + 2 × 103 + 4 × 102 + 6 × 101 + 8 × 100로 표현할 수 있다.

회문(Palindrome)이란 앞으로 읽으나 뒤로 읽으나 같은 글을 말한다. 예를 들면, madam, level, 12321은 회문이다. 반면에, Chung-ang이나 university, 54899는 회문이 아니다.

어떤 십진수의 수 A가 주어졌을 때, 이를 n진수로 표현하면 회문인지 아닌지 판별하는 프로그램을 만드시오.

입력

첫째 줄에 테스트 케이스의 수 T(1 ≤ T ≤ 1000)이 주어진다.

둘째 줄부터 T줄에 걸쳐 테스트 케이스별로 어떤 십진수의 수 A(1 ≤ A ≤ 100,000,000,000)와 n(2 ≤ n ≤ 16)이 공백을 두고 주어진다.

출력

각 줄마다 테스트 케이스가 회문일 경우 1, 아닐 경우에는 0을 출력한다.

풀이

이 문제는 진법 변환과 회문 비교가 적절히 섞인 문제라고 할 수 있습니다.

입력받은 십진수를 입력받은 진수로 변환한 후, 그 수가 회문인지 아닌지를 비교하는 것입니다.

우선 입력받은 십진수를 맞는 진수로 변환하기 위해서는 반복 과정이 필요합니다.

반복적으로 십진수를 나누고, 그 나머지를 각 자리에 추가해 나가는 방식으로 계산을 해줍니다.

진수 변환이 끝났다면, 이제 회문 비교를 할 차례 입니다.

간단하게 그 수가 그 수를 뒤집은 것과 같다면 회문이기 때문에 1을 출력,

아니라면 0을 출력하도록 합니다.

코드

loop = int(input())

for i in range(loop):
    num, format = map(int, input().split())
    result = ""
    while num > 0:
        tmpLeft = num % format
        if tmpLeft > 9:
            tmpLeft = chr(55 + tmpLeft)
        result = str(tmpLeft) + result
        num //= format
        
    if result == result[::-1]:
        print(1)
    else:
        print(0)