https://www.acmicpc.net/problem/1334
1334번: 다음 팰린드롬 수
팰린드롬 수는 앞으로 읽어도, 뒤로 읽어도 같은 숫자이다. 101, 4, 6666와 같은 숫자는 팰린드롬 수이고, 10, 564, 15452와 같은 숫자는 아니다. 어떤 수 N이 주어질 때, N보다 큰 팰린드롬 수 중에서 가
www.acmicpc.net
문제해석
주어진 문자열의 길이가 홀수인경우
중앙을 기준으로 자른 앞숫자를 A 앞숫자를 뒤집은 수를 A' 뒷글자를 B 뒷글자를 뒤집은 수를 B'라고하자
B'>=A인경우 중앙의 수를 1올려주고 중앙앞은 A 중앙뒤는 A'로 해주면 된다.
ex) 36583인경우 B'(=38) >= A(=36) 이므로 답은 36663이된다.
단 중앙의 수가 9여서 1을 올려야하는 상황인데 자릿수가 달라지면 예외 처리를 해주어야한다.
9999999 인경우가 그런 예시인데 답이 9990999가 아니라 10000001가 되어야한다.
B'<A인경우 중앙의 수를 그대로 두고 중앙앞은 A 중앙뒤는 A'로 해주면된다.
ex) 36553인경우 B'(=35) < A(=36) 이므로 답은 36563이된다.
주어진 문자열의 길이가 짝수인경우
주어진 문자열의 앞쪽반을 A 이를 뒤집은 수를 A' 뒤쪽 반을 B 이를 뒤집은 수를 B'라고하자
이도 마찬가지로 아래 두가지경우로 나눌 수 있다.
B'>=A일때 A의 일의 자리수를 1 더한 값을 C 이를 뒤집은 수를 C'로 두자 답은 CC'가된다.
ex) 362263인경우 B'(=362) >= A(=362) 이므로 C는 362+1=363가되고 답은 CC' = 363363이된다.
여기서도 A에 1을 더한후의 값이 C가되는데 A의 자릿수와 C의 자릿수가 다를때를 예외처리 해주어야한다.
B'<A일때 답은 AA'이다.
ex) 367563인경우 B'(=365) < A(=367) 이므로 답은 367763이된다.
코드
n=input()
if len(n)==1:
n=int(n)
if n==9:
print(11)
else:
print(n+1)
elif len(n)&1:
a=int(n[:len(n)//2][::-1])
b=int(n[len(n)//2+1:])
if a>b:
print(n[:len(n)//2]+n[len(n)//2]+n[:len(n)//2][::-1])
else:
if int(n[len(n)//2])==9:
c=str(int(n[:len(n)//2])+1)
if len(c)==len(n[:len(n)//2]):
print(c+"0"+c[::-1])
elif len(c)>len(n[:len(n)//2]):
print(c+c[::-1])
else:
print(n[:len(n)//2]+str(int(n[len(n)//2])+1)+n[:len(n)//2][::-1])
else:
a=int(n[:len(n)//2][::-1])
b=int(n[len(n)//2:])
if a>b:
print(n[:len(n)//2]+n[:len(n)//2][::-1])
else:
c=str(int(n[:len(n)//2])+1)
if len(c)==len(n[:len(n)//2]):
print(c+c[::-1])
elif len(c)>len(n[:len(n)//2]):
print(c+c[::-1][1:])
'백준문제풀이' 카테고리의 다른 글
백준 문제 1509번 팰린드롬 분할 문제풀이 c++ (0) | 2022.03.20 |
---|---|
백준 문제 10942번 팰린드롬? 문제풀이 c++ (0) | 2022.03.20 |
백준 문제 1005번 ACM Craft 문제풀이 c++ (0) | 2022.03.13 |
백준 문제 1002번 터렛 문제풀이 c++ (0) | 2022.03.13 |
백준 문제 17387번 선분 교차 2 문제풀이 c++ (0) | 2022.03.13 |