알고리즘 풀이/Python

[Python] 숫자 조작 (SWEA D3 13428번 파이썬)

모남(monam2) 2023. 11. 13. 23:36

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AX4EJPs68IkDFARe

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

9자리 이하의 음이 아닌 정수 N이 있다. 당신은 이 수에서 한 쌍의 숫자를 골라 그 위치를 바꾸는 일을 최대 한 번 하여(안 하거나, 한 번만 하여) 새로운 수 M을 만들 수 있다. 단, 바꾼 결과 M의 맨 앞에 ‘0’이 나타나면 안 된다.

M의 최솟값과 최댓값을 구하는 프로그램을 작성하라.

[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스는 하나의 줄로 이루어진다. 각 줄에는 0 이상 999,999,999 이하의 정수 N이 주어진다. N ≠ 0 이라면 주어지는 수가 0으로 시작하지 않는다.


[출력]
각 테스트 케이스마다, M의 최솟값과 최댓값을 공백 하나를 사이로 두고 출력한다.

 

 

 


 

 

입력 조건이 10억 미민의 정수인 것을 보고, 완전탐색을 제외한 다른 알고리즘을 생각해보았으나 해결하지 못했습니다.

결국 완전탐색을 이용했고, 두 숫자만 비교하면 되므로 for반복문 두 개를 이용해 겹치지 않도록 비교했습니다.

 

선택한 두 개의 숫자를 버블정렬 과정처럼 tmp변수를 통해 스왑하면서, 바뀐 숫자를 점검합니다.

최댓값 최솟값을 각각 무한대, 0으로 설정하지 않는 이유는 10000이 들어왔을 때는 첫번째 조건문에서 걸러져 입력된 값이 그대로 출력버리기 때문입니다.

최댓값/최솟값이라면 갱신하는데, 이때 앞자리가 0인 경우는 제외해야 합니다.

 

 

코드

T = int(input())
for t in range(1,T+1):
    n = input()
    if n=='0':
        print(f"#{t} 0 0")
        continue

    #join 사용을 위한 문자열로 병합 후 정수로 변환
    max_value = int(n)
    min_value = int(n)
    # 입력이 10000 이런 경우 어떻게 스왑을 하든 맨앞에 0이 오게됨
    # -> 10000은 최댓값과 최솟값이 같다.

    leng = len(list(n))
    for i in range(leng-1):
        for j in range(i+1, leng):
            new_n = list(n)
            tmp = new_n[i]
            new_n[i] = new_n[j]
            new_n[j] = tmp

            if new_n[0] == '0':
                continue
            chng_n = int(''.join(new_n))
            if chng_n > max_value:
                max_value = chng_n
            if chng_n < min_value:
                min_value = chng_n
    print(f"#{t} {min_value} {max_value}")