2016년 9월 28일 수요일

BOJ 1334 다음 팰린드롬 수

어떤 수 N이 주어질 때, N보다 큰 팰린드롬 수 중에서 가장 작은 수를 구하는 문제이다.
N은 최대 50자리인 양수이다. 문제 분류를 보니 수학, 문자열 처리로 되어있다.
N이 최대 50자리이므로 문자열로 처리하면 될 것이고, 주어진 N보다 큰 팰린드롬 수 중 가장 작은 수를 구하는 것은 N을 변형해서 만들면 될 것 같다.

홀수 자리의 N이 주어진다면 가운데 수 하나를 기준으로 양쪽으로 나눠지는데, 왼쪽(앞쪽)의 수를 변형하지 않고 그것을 기준으로 팰린드롬을 만드는 것이 가장 원래 수와 가까운 수를 만드는 방법일 것이다. 가운데 수 하나를 기준으로 대칭되게 만드는데, 왼쪽의 수를 기준으로 해서 만들어보고 만약 이 값이 더 크면 그것이 답이 되겠지만 크지 않다면 가운데 수를 1증가 시켜주면 될 것이다. 만약 가운데 수가 9라면 가운데 수를 0으로 바꾸고 가운데 수 바로 왼쪽 자리의 수를 1증가 시켜주고 오른쪽도 1증가 시켜주면 될 것이다.

짝수 개의 경우 딱 반으로 나뉘는데, 이것도 역시 왼쪽을 기준으로 팰린드롬을 만드는데 만든 수가 원래 수보다 크지 않다면 왼쪽 수를 1증가 시키고 대칭되게 만들면 될 것이다.

9999같은 것은 왼쪽 99를 1증가 시키면 100 이 되고 이것을 기준으로 만들면 100001이 된다.
문자열이므로 크기 비교는 문자 하나하나를 비교해주면 될 것 같다. 따로 함수를 만드는 게 편할 것 같다.
그리고 구현할 때는 왼쪽 문자열을 기준으로 해서 하면서, 크기 비교시에는 전체를 비교하지 말고 왼쪽 문자열을 거꾸로 보면서 원래 문자열의 오른쪽 문자열과 비교하게 하면 될 것 같다. 그리고 숫자를 만들어서 출력할 필요 없이 왼쪽 문자열이 결정되면 왼쪽 문자열을 출력하고 (가운데 수가 있다면)가운데 수 출력하고 왼쪽 문자열을 거꾸로 출력하면 될 것이다.

직접 구현해 봐야겠다.
 구현하는데 꽤 오래 걸렸다. 100줄 정도가 나온다. 으...44퍼까지 갔다가 틀렸다...
길이가 짝수인 9999 같은 경우 내가 구현한대로 하면 100001이 나온다. 10001이 나와야되는데...이런 경우는 처리를 해줘야겠다. 아 홀수도 마찬가지다... 다 처리를 해줘야겠다.

왼쪽값에 1을 더해줬을 때 자리수가 늘어나면 한 자리는 덜 출력하는 것으로 했는데
7-80퍼에서 또 틀렸다... 음...아.. 한 자리 수를 처리 안해줬다.. 한 자리수는 그냥 출력하면 된다. 아 아니구나 1증가해서 출력해야 하는데, 9의 경우를 생각해서 처리를 해주면 될 것 같다. AC를 받았다.
지금 yukariko님의 코드를 보고 있는데 엄청 간결하고 짧은 코드이다.
보면서 깨달은 것이, 문자열을 비교할 때, 따로 함수 만들 필요 없이 그냥 strcmp를 써도 된다... 그리고 길이가 짝수인 경우 홀수인 경우도 따로 if, else로 구분할 필요 없이 for(i=len/2+len%2... 이런 식으로 한 것도 그렇고.. 음 여러가지로 대단하다. 일단 풀어야 할 문제가 많으니 다음에 풀 수 있으면 다시 풀어봐야겠다.



댓글 없음:

댓글 쓰기