STUDY/Algorithm

[백준] 1334 다음 팰린드롬 수

sinawi95 2021. 2. 5. 23:59
728x90

www.acmicpc.net/problem/1334

 

1334번: 다음 팰린드롬 수

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

www.acmicpc.net


s_num = input()

len_num=len(s_num)
s_num_half= s_num[:(len_num+1)//2]

result= ''

if s_num == '9'*len_num:
    print(int(s_num)+2)
elif len_num == 1:
    print(int(s_num)+1)

elif len_num%2:   # odd
    tmp = s_num_half + s_num_half[-2::-1]
    if int(tmp)> int(s_num):
        print(tmp)
    else:
        tmp = str(int(s_num_half)+1)
        tmp = tmp[:]+tmp[-2::-1]
        print(tmp)

else:           # even
    tmp = s_num_half[:] + s_num_half[::-1]
    if int(tmp)> int(s_num):
        print(tmp)
    else:
        tmp = str(int(s_num_half)+1)
        tmp = tmp[:]+tmp[::-1]
        print(tmp)
    

이전부터 계속 해왔던 방식인 문자열로 받아서 비교하는 식으로 접근했다. 

문자열로 받으면 반을 잘라서 이어붙이기도 편해서 쉽게 팰린드롬수를 만들수 있었다.

 

자리수가 홀수인지 짝수인지 확인하고 그에 맞게 뒤집어서 붙여주어서 팰린드롬을 만든다.

이때 입력받은 수와 만들어진 팰린드롬의 크기를 비교해서 그대로쓸지 값을 높여줄지 정해준다.

값을 높일 때는 입력받은 수보다 크면서 팰린드롬을 만들어줘야하기때문에 반을 자른수에 1을 더한 값으로 만들어준다. (s_num_half+1)

우선, 1차 시도는 빠르게 틀렸다.

반례를 찾아보니 한자리수인경우 문자열을 두번 반복했다. (1을 받으면 11을 출력함)

이를 해결하기위해 길이가 1이면 입력값에 1을 더해서 출력했다.

2차 시도 또한 얼마 가지못해 틀렸다.

이때는 뭐가 잘못된지 몰라서 직접 돌려가면서 직접 돌려봤는데 모든 자리수가 '9'로 채워진 경우가 문제였다.

원래의 코드로는 '9'가 입력되면 '10'이되고 '1001'을 출력했다.

그래서 맨 앞에 모든 자리수가 '9'라면 +2를 더하게 만들었다. 

이렇게 만든 결과 3차 시도는 성공했다.

 


더보기
f=open('./1334.txt','w')

s_num_list = []
for i in range(1,50):
    tmp = '9'*i
    s_num_list.append(int(tmp))
#print(s_num_list)

for num in s_num_list:
    print(num)
    s_num = str(num)
    data=f'{s_num}\t'
    f.write(data)
    len_num=len(s_num)
    s_num_half= s_num[:(len_num+1)//2]

    if s_num == '9'*len_num:
        data=str(int(s_num)+2)
        f.write(data)
        f.write('\n')
    elif len_num == 1:
        f.write(s_num)
        f.write('\n')

    elif len_num%2:   # odd
        tmp = s_num_half + s_num_half[-2::-1]
        if int(tmp)> int(s_num):
            f.write(tmp)
            f.write('\n')
        else:
            tmp = str(int(s_num_half)+1)
            tmp = tmp[:]+tmp[-2::-1]
            f.write(tmp)
            f.write('\n')

    else:           # even
        tmp = s_num_half[:] + s_num_half[::-1]
        if int(tmp)> int(s_num):
            f.write(tmp)
            f.write('\n')
        else:
            tmp = str(int(s_num_half)+1)
            tmp = tmp[:]+tmp[::-1]
            f.write(tmp)
            f.write('\n')

4차시도긴 하지만 작은 실수여서 넘어간다 ㅋㅋ

 

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 3985 롤케이크  (0) 2021.02.06
[백준] 2386 도비의 영어공부  (0) 2021.02.06
[백준] 1463 1로만들기  (0) 2021.02.05
[백준] 1259 팰린드롬수  (0) 2021.02.05
[백준] 1292 쉽게푸는 문제  (0) 2021.02.05