본문 바로가기
알고리즘

[알고리즘 문제] 유니가 더한 수 (Python / 파이썬)

by yewonnie 2022. 5. 19.

문제

유니는 대칭 강박증이 있다.
특히 좌우 대칭이 맞지 않는 것을 참지 못한다. 숫자에서도 마찬가지다. 유니는 수학 문제를 풀다가 필기한 숫자들을 보고 그만 양수를 더하여 각 수에 대해서 좌우 대칭이 되도록 만들었다. 다행인지 불행인지 유니는 대칭이 되는 최소 값이 되도록 양수를 더하였다. 유니가 적은 수는 0으로 시작할 수 있는데, 0으로 시작할 경우 유니는 0까지 포함한 자릿수가 유지되면서 대칭이 되도록 수를 더한다.
이때, 유니가 더한 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트케이스의 수 T가 주어진다..
각 테스트케이스의 첫 줄에 유니가 필기한 수가 주어진다. 유니가 필기한 수는 2자리 이상 9자리 이하의 자연수다.
( 1 ≤ T ≤ 10 )

출력

각 테스트케이스마다 '#'과 테스트케이스의 번호, 공백을 출력한 뒤 유니가 더한 수를 출력한다.

문제 풀이

유니가 필기한 수에 양수를 더하여 좌우 대칭이 되도록 만드는 문제이다. 

어떤 수를 더했을 때 그 결과가 좌우 대칭이 되는지 확인해야 하므로 

1씩 수에 더해주며 더한 횟수를 count 해주면 된다.

그리고 더할 때마다 좌우 대칭이 되는지 확인해주고 

좌우 대칭이라면 탐색을 종료해준다. 

 

이때 주의해야할 점은 수가 0으로 시작할 수 있는데 0으로 포함한

자릿수가 유지되면서 대칭이 되도록 수를 더해야 한다는 점이다. 

따라서 0과 자릿수가 유지되도록 수를 입력 받아 

수의 각 자릿수의 값을 하나씩 배열에 저장해주었다. 

그런 다음 실제 손으로 덧셈을 할 때처럼 뒤에서부터 1을 더해주고 

올림을 해야한다면 올림해준다. 

이렇게 하면 배열에 0과 자릿수가 그대로 유지된 채 덧셈을 하므로

원하는 결과를 얻을 수 있다. 

 

좌우 대칭이 되는지 확인하는 방법은 간단하다. 

먼저 array에 저장된 수들을 모두 문자열로 만들어 더해주어

하나의 문자열로 만들어준다. 그리고 만약 문자열을 뒤에서 부터 읽었을 때와 

원래 문자열과 결과가 똑같다면 좌우 대칭이므로 True를 반환해준다.


My Code

# 좌우대칭인지 확인
def check():
    num = ''
    for i in array:
        num += str(i) # 숫자들을 하나의 문자열로 만들어줌
    if num == num[::-1]: # 뒤에서 부터 읽은 것과 원본이 같다면
        return True # 좌우대칭
    return False  # 다르다면 좌우대칭 아님

for tc in range(int(input())):
    n = input() # 유니가 필기한 수

    array = []
    for i in n:
        array.append(int(i)) # 각 자릿수의 수를 배열에 저장

    count = 0
    while True:
        if check(): # 좌우대칭이라면 탐색 종료
            break 
        
        array[-1] += 1 # 맨 뒤 숫자에 1을 더해줌
        for i in range(len(array) - 1, 0, -1):
            if array[i] == 10: # 더한 결과가 10이라면 
                array[i - 1] += 1 # 앞에 수에 올림해줌
                array[i] -= 10    # 10인 자리는 10을 빼줌

        count += 1 # 더한 횟수를 세어줌

    print('#' + str(tc + 1), end = ' ')
    print(count)

 

댓글