[ swea / d3 ] 13428. 숫자 조작

HYEJIN·2022년 5월 25일
0

SWEA

목록 보기
2/3

13428. 숫자 조작

참고풀이

  • num[i]와 num[j~len(num)]의 자리를 하나씩 바꿔가면서 그 값이 최소값인지 최대값인지 비교 후 값 저장
  • 자리는 한번밖에 바꿀 수 없음으로 다시 원상태로 돌림
  • 계속해서 자리바꾸고 값을 비교해나가며, 최소 최대값을 갱신함
    ( 예외,첫번째 자리에 0이 오면 안되는경우 )

코드

if __name__=='__main__':
    T = int(input())
    for tc in range(1, 1 + T):
        num = list(input())
        min_num,max_num = ''.join(num),''.join(num)

        for i in range(len(num) - 1):
            for j in range(i + 1, len(num)):
            		#첫번째 자리에 0이 오게될 경우 제외 
                    if i==0 and num[j]=='0':
                        continue

                    num[i],num[j]=num[j],num[i]
                    min_num = min(min_num,''.join(num))
                    max_num = max(max_num, ''.join(num))
                    num[i],num[j]=num[j],num[i] #숫자 1번만 바꿀수있음으로 원상태로 복귀 

        print(f"#{tc} {min_num} {max_num}")

이전풀이

  • 원래는 함수로 풀이하며 한번 자리를 바꾸면 return 하는 형태로 구현
  • 코드 가독성도 좋지 않았기 때문에 다른사람 풀이를 참고하여 다시 코드를 짰다.
  • 이 전의 코드는 테스트케이스 일부만 맞았는데 왜그런지 아무리 생각해도 모르겠다...

1) i번째 있는 값(num[i])과 i+1~len(num)에 있는 값을 일일히 비교
>> i+1~len(num)에 있는 값 중에서도 크거나 작은 값과 인덱스(위치)를 따로 저장한다.
2) 한번 자리를 바꾸면 이후에는 바꿀 수 없음으로 바로 return을한다.

def changeNum(case,num):
    arr = num.copy()
    # 1번이동 최소로 변경
    if case == 1:
        for i in range(len(arr)-1):
            index = 0
            num_min = 99
            for j in range(i+1,len(arr)):
                if arr[i]>arr[j]:
                    if i==0 and arr[j]==0:
                        continue
                    elif arr[j]<num_min:
                        index=j
                        num_min = arr[j]
            if index!=0 :
                arr[i],arr[index]=arr[index],arr[i]
                return ''.join(map(str,arr))

   #1번이동 최대로 변경
    if case == 2:
        for i in range(len(arr)-1):
            index = 0
            num_max = -1
            for j in range(i+1,len(arr)):
                if arr[i]<arr[j]:

                    if arr[j]>num_max:
                        index=j
                        num_max = arr[j]
            if index!=0 :
                arr[i],arr[index]=arr[index],arr[i]
                return ''.join(map(str,arr))

    return ''.join(map(str,arr))

if __name__=='__main__':
    T = int(input())
    for tc in range(1, 1 + T):
        num = list(map(int,input()))
        print(f"#{tc} {changeNum(1,num)} {changeNum(2, num)}")

0개의 댓글