Problem Solving/BOJ

[BOJ] 1334: 다음 팰린드롬 수 Solution

happykoa 2020. 3. 1. 22:47

문제 소개

 

2020.03.01 기준,  실버2 티어 문제입니다.

 

조금의 생각만 하면 풀 수 있는 정도의 문제입니다.

 

문제 링크

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

 

1334번: 다음 팰린드롬 수

팰린드롬 수는 앞으로 읽어도, 뒤로 읽어도 같은 숫자이다. 101, 4, 6666와 같은 숫자는 팰린드롬 수이고, 10, 564, 15452와 같은 숫자는 아니다. 어떤 수 N이 주어질 때, N보다 큰 팰린드롬 수 중에서 가장 작은 수를 출력한다.

www.acmicpc.net

아이디어

일단 처음에 낚시당할 만한 것은 주어지는 수보다 큰 숫자 중에 답이 있고, 그렇기 때문에 팰린드롬을 판단할 때 기존의 수에 1을 더하고 시작해야 한다는 것입니다.

 

그리고 시작한 수가 N자리 수라면 N자리 수 이내에 답이 존재합니다.

예를 들어, 시작한 수가 5자리 수라면 9로만 이루어진 99999가 답이 되기 때문입니다.

 

핵심적인 내용은 코드의 수석으로 달아놨으니 코드로 봐주시기 바랍니다 :)

 

코드

# 숫자 입력 및 가공
s = int(input())
s +=1
s = list(map(int,list(str(s))))
# 적당히 10000번쯤 돌리면 수렴함
for i in range(10000):
    # 리스트의 절반만 탐색하면 됨(어차피 앞 뒤로 같이 탐색함)
    for i in range(0,len(s)//2+1):
        # 앞뒤 숫자가 다른데, 뒤의 숫자가 큰 경우는 뒷의 숫자 앞의 수의 변조가 필요함.
        if s[i] < s[len(s)-i-1]:
            s[len(s)-i-2] += 1
        # 그리고나서 뒤의 숫자를 앞의 숫자와 같게 만듬.
        s[len(s)-i-1] = s[i]
        # 자릿수 올림이 필요한 경우가 있을 수 있으니 수치를 다듬음.
        for i in range(len(s)-1,-1,-1):
            if s[i] >=10:
                s[i],s[i-1] = s[i]%10,s[i-1]+s[i]//10
# 출력
for i in s:
    print(i,end="")

Rmx

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ] 1500: 최대 곱 Solution  (0) 2020.03.02
[BOJ] 2830: 행성 X3 Solution  (0) 2020.03.02
[BOJ] 1024: 수열의 합 Solution  (0) 2020.03.01
[BOJ] 4889: 안정적인 문자열 solution  (0) 2020.02.24
[BOJ] 2018: 수들의 합 5 solution  (0) 2020.02.24