TODAY TIL

안녕하세요! 오늘은 재미있는 숫자 조작 문제를 함께 풀어보겠습니다. 이 문제는 주어진 숫자에서 같은 홀수끼리, 또는 같은 짝수끼리만 자리를 교환하여 가장 큰 숫자를 만들어야 하는 도전 과제입니다. 누구나 쉽게 이해할 수 있도록 하나하나 단계별로 풀어보겠습니다.


문제 설명

입력: 양의 정수 num
목표: num의 각 자릿수를 같은 홀수 또는 짝수끼리만 교환하여 만들 수 있는 가장 큰 값을 반환합니다.

단, 홀수와 짝수는 서로 교환할 수 없습니다.

예시

  1. 입력: 1234
    출력: 3412
    설명:
    • 홀수(1, 3)를 교환하여 큰 값이 앞에 오도록 정렬합니다.
    • 짝수(2, 4)를 교환하여 큰 값이 앞에 오도록 정렬합니다.
  2. 입력: 65875
    출력: 87655
    설명:
    • 짝수(6, 8)를 교환하여 큰 값이 앞에 오도록 정렬합니다.
    • 홀수(5, 5, 7)를 교환하여 큰 값이 앞에 오도록 정렬합니다.

문제 해결 방법

  1. 숫자의 홀수와 짝수를 분리합니다.
  2. 각 그룹(홀수, 짝수)을 내림차순으로 정렬합니다.
  3. 원래 숫자의 각 자릿수를 확인하며, 해당 자릿수가 홀수이면 정렬된 홀수 리스트에서 값을 꺼내고, 짝수이면 짝수 리스트에서 값을 꺼냅니다.
  4. 최종적으로 만들어진 숫자를 반환합니다.

코드 구현

아래는 이 문제를 해결하는 Python 코드입니다. 간단한 주석을 추가하여 쉽게 이해할 수 있도록 했습니다.

def largestNumberAfterSwaps(num):
    # 1. 숫자를 문자열로 변환하고 홀수와 짝수 분리
    num_str = str(num)
    odds = [int(d) for d in num_str if int(d) % 2 != 0]  # 홀수 리스트
    evens = [int(d) for d in num_str if int(d) % 2 == 0]  # 짝수 리스트
    
    # 2. 각각 내림차순으로 정렬
    odds.sort(reverse=True)  # 큰 숫자가 앞에 오도록
    evens.sort(reverse=True)
    
    # 3. 원래 숫자의 자리 순서에 맞게 재배치
    result = []
    for digit in num_str:
        if int(digit) % 2 == 0:  # 짝수 자리라면
            result.append(evens.pop(0))  # 짝수 리스트에서 가장 큰 값 추가
        else:  # 홀수 자리라면
            result.append(odds.pop(0))  # 홀수 리스트에서 가장 큰 값 추가
    
    # 4. 리스트를 합쳐서 정수형으로 변환
    return int(''.join(map(str, result)))

# 테스트 예제
print(largestNumberAfterSwaps(1234))  # Output: 3412
print(largestNumberAfterSwaps(65875))  # Output: 87655

 

코드 설명 (누구나 쉽게 이해하기)

  1. 숫자를 문자로 변환하고 홀수와 짝수 분리
    숫자 num을 문자열로 변환합니다. 각 자릿수를 순회하며 홀수와 짝수를 분리합니다.
    예를 들어, num = 65875라면:
    • 홀수 리스트: [5, 5, 7]
    • 짝수 리스트: [6, 8]
  2. 정렬
    홀수와 짝수를 각각 내림차순으로 정렬합니다. 이렇게 하면 가장 큰 숫자가 앞으로 옵니다.
    예를 들어:
    • 정렬된 홀수 리스트: [7, 5, 5]
    • 정렬된 짝수 리스트: [8, 6]
  3. 재배치
    원래 숫자의 각 자릿수를 순회하며, 홀수 자리에는 정렬된 홀수 리스트의 첫 번째 값을 넣고, 짝수 자리에는 정렬된 짝수 리스트의 첫 번째 값을 넣습니다.
    • 원래 숫자: 65875
    • 재배치: [8, 7, 6, 5, 5]
  4. 최종 숫자로 변환
    재배치된 리스트를 문자열로 합친 뒤 정수형으로 변환하여 반환합니다.

예제 설명

입력: 1234

  1. 홀수: [1, 3], 짝수: [2, 4]
  2. 정렬 후: 홀수 [3, 1], 짝수 [4, 2]
  3. 자리 배치: [3, 4, 1, 2]
  4. 결과: 3412

입력: 65875

  1. 홀수: [5, 5, 7], 짝수: [6, 8]
  2. 정렬 후: 홀수 [7, 5, 5], 짝수 [8, 6]
  3. 자리 배치: [8, 7, 6, 5, 5]
  4. 결과: 87655

정리

이 문제는 자릿수의 홀짝성(Parity)을 기준으로 숫자를 정렬하고 재배치하는 간단하지만 재미있는 문제였습니다.
Python의 리스트 처리와 정렬 기능을 활용하면 직관적으로 풀 수 있습니다. 이 코드는 실전 코딩 테스트에서도 활용도가 높으니 꼭 연습해 보세요!

오늘도 코딩 재미있게 하세요! 😊

+ Recent posts