TODAY TIL
안녕하세요! 오늘은 재미있는 숫자 조작 문제를 함께 풀어보겠습니다. 이 문제는 주어진 숫자에서 같은 홀수끼리, 또는 같은 짝수끼리만 자리를 교환하여 가장 큰 숫자를 만들어야 하는 도전 과제입니다. 누구나 쉽게 이해할 수 있도록 하나하나 단계별로 풀어보겠습니다.
문제 설명
입력: 양의 정수 num
목표: num의 각 자릿수를 같은 홀수 또는 짝수끼리만 교환하여 만들 수 있는 가장 큰 값을 반환합니다.
단, 홀수와 짝수는 서로 교환할 수 없습니다.
예시
- 입력: 1234
출력: 3412
설명:- 홀수(1, 3)를 교환하여 큰 값이 앞에 오도록 정렬합니다.
- 짝수(2, 4)를 교환하여 큰 값이 앞에 오도록 정렬합니다.
- 입력: 65875
출력: 87655
설명:- 짝수(6, 8)를 교환하여 큰 값이 앞에 오도록 정렬합니다.
- 홀수(5, 5, 7)를 교환하여 큰 값이 앞에 오도록 정렬합니다.
문제 해결 방법
- 숫자의 홀수와 짝수를 분리합니다.
- 각 그룹(홀수, 짝수)을 내림차순으로 정렬합니다.
- 원래 숫자의 각 자릿수를 확인하며, 해당 자릿수가 홀수이면 정렬된 홀수 리스트에서 값을 꺼내고, 짝수이면 짝수 리스트에서 값을 꺼냅니다.
- 최종적으로 만들어진 숫자를 반환합니다.
코드 구현
아래는 이 문제를 해결하는 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
코드 설명 (누구나 쉽게 이해하기)
- 숫자를 문자로 변환하고 홀수와 짝수 분리
숫자 num을 문자열로 변환합니다. 각 자릿수를 순회하며 홀수와 짝수를 분리합니다.
예를 들어, num = 65875라면:- 홀수 리스트: [5, 5, 7]
- 짝수 리스트: [6, 8]
- 정렬
홀수와 짝수를 각각 내림차순으로 정렬합니다. 이렇게 하면 가장 큰 숫자가 앞으로 옵니다.
예를 들어:- 정렬된 홀수 리스트: [7, 5, 5]
- 정렬된 짝수 리스트: [8, 6]
- 재배치
원래 숫자의 각 자릿수를 순회하며, 홀수 자리에는 정렬된 홀수 리스트의 첫 번째 값을 넣고, 짝수 자리에는 정렬된 짝수 리스트의 첫 번째 값을 넣습니다.- 원래 숫자: 65875
- 재배치: [8, 7, 6, 5, 5]
- 최종 숫자로 변환
재배치된 리스트를 문자열로 합친 뒤 정수형으로 변환하여 반환합니다.
예제 설명
입력: 1234
- 홀수: [1, 3], 짝수: [2, 4]
- 정렬 후: 홀수 [3, 1], 짝수 [4, 2]
- 자리 배치: [3, 4, 1, 2]
- 결과: 3412
입력: 65875
- 홀수: [5, 5, 7], 짝수: [6, 8]
- 정렬 후: 홀수 [7, 5, 5], 짝수 [8, 6]
- 자리 배치: [8, 7, 6, 5, 5]
- 결과: 87655
정리
이 문제는 자릿수의 홀짝성(Parity)을 기준으로 숫자를 정렬하고 재배치하는 간단하지만 재미있는 문제였습니다.
Python의 리스트 처리와 정렬 기능을 활용하면 직관적으로 풀 수 있습니다. 이 코드는 실전 코딩 테스트에서도 활용도가 높으니 꼭 연습해 보세요!
오늘도 코딩 재미있게 하세요! 😊
'python' 카테고리의 다른 글
99클럽 코테 스터디_4기 30일차 TIL (0) | 2024.11.27 |
---|---|
99클럽 코테 스터디_4기 29일차 TIL (1) | 2024.11.26 |
99클럽 코테 스터디_4기 27일차 TIL (0) | 2024.11.25 |
99클럽 코테 스터디_4기 26일차 TIL (0) | 2024.11.24 |
99클럽 코테 스터디_4기 25일차 TIL (0) | 2024.11.23 |