1334번: 다음 팰린드롬 수 (acmicpc.net)
## 풀이
N은 최대 50자리인 양의 정수이다
숫자가 매우 커서
def is_palindrome(k):
len_div2 = len(k)//2
if len(k)%2 == 0:
if k[:len_div2] == k[len_div2:][::-1]:
return True
else:
if k[:len_div2] == k[len_div2 + 1:][::-1]:
return True
return False
def sol():
n = int(input()) + 1
while(True):
if is_palindrome(str(n)) == True:
print(n)
break
n += 1
return None
sol()
이런걸 내면 시간초과 된다. 문자열을 이용해서 풀었다.
## code
def sol():
n = str(int(input()) + 1)
# 들어오는 숫자가 최대 50자리인 양의 정수 - 매우 크다
while(True):
# 한자리면 1더한걸로 끝
if(len(n) == 1):
print(n)
break
# 짝수
# 가운데를 중심으로 뒷부분을 잘라서 더한게 앞부분의 반대가 될수있나 보고, (back이 front 뒤집은것보다 작아야)
# 안된다면 front에 1 더한걸 뒤집은게 back에 와야
# front + back 이렇게 자르자
len_div2 = len(n)//2
front = n[:len_div2]
if len(n)%2 == 0:
back = n[len_div2:]
# back에 숫자를 더해서 front 뒤집은게 될수 있나?(front 뒤집은것보다 back가 작은가?)
if int(back) <= int(front[::-1]):
print(front + front[::-1])
break
else:
# front 1 더했을때 자리수 넘어가는 경우, 그러면 홀수인경우로 넘어가게 된다.
if len(str(int(front))) != len(str(int(front) + 1)):
n = '1' + '0' * len(n)
continue
else: # 자리수 넘어가지 않으면 front에서 1더한걸로 결과 내기
front = str(int(front) + 1)
print(front + front[::-1])
break
# 홀수
else:
back = n[len_div2 + 1:]
mid = n[len_div2 : len_div2+1]
# back 에 숫자를 더해서 front 뒤집은게 될수 있나, 중간 한글자 제외
if int(back) <= int(front[::-1]):
print(front + mid + front[::-1])
break
else:
# front + mid 더했을때 자리수 넘어가는 경우, 그러면 짝수인경우로 넘어가게 된다.
if len(str(int(front+mid))) != len(str(int(front+mid) + 1)):
n = '1' + '0' * len(n)
continue
else: # 자리수 넘어가지 않으면 mid에서 1더한걸로
# 홀수는 mid에 1을 먼저 더하는게 맞다. N보다 큰수증 작은수이므로
# 그리고 back은 0으로
n = str(int(front + mid) + 1) + '0' * len(back)
continue
return None
sol()
들어온 숫자를 잘라서 뒤집어서 front == back인지 확인하되
들어온 숫자의 자리수가 짝수개인지, 홀수개인지에 따라서 해야 할 일이 달라진다
짝수는 front에 1을 더하면 되고
만약 front에 1을 더할경우 자리올림이 발생시, 원래 숫자보다 한자리 긴 100...00으로 다시 홀수인 경우로 가서 따져보면 된다.
홀수는 mid에 1을 더해야 하고, 짝수일때처럼 그걸 뒤집어서 print 해도 될것 같은데 지금 보니까 코드에 일관성이 없네... back 을 00...00으로 만들고 continue로 다시 큰 while문 돌게 만들었다.
자리수 넘어가는 경우는 원래 숫자보다 한자리 긴 100...00으로 다시 짝수인경우로 넘어가서 따지면 된다.
그리고 문제 예제에서 숫자가 한자리라면 1을 더한걸 출력하면 되고, 처음에 받자마자 1을 더했기때문에 9인 경우에도 문제가 없다.
if int(back) <= int(front[::-1]):
이 부분에 등호가 없다면, 10을 입력받았을때 22가 나오게 된다. 등호 있으면 11이 나온다.
def check(num):
for i in range(len(str(num))//2):
while num[i] != num[len(num)-1-i]:
num = str(int(num)+10**i)
print(num)
num = input()
check(str(int(num)+1))
?
for문으로 문자열의 인덱스를 잡고 절반만 돌리면서 비교하고
다른부분 인덱스에 10**i 곱해서 더하는식으로 문자열을 바꿔서 맞추는
어쨌든 숫자를 1씩 더하지 말고 문자만 바꿔야 되는것 같다
0 댓글