[99클럽 29일차] [LeetCode] 2231. Largest Number After Digit Swaps by Parity

Dev.Dana·2024년 11월 25일
0

Algorithm

목록 보기
22/25
post-thumbnail

[LeetCode] 2231. Largest Number After Digit Swaps by Parity

문제 설명

숫자로 이루어진 정수 num이 주어졌을 때 같은 자릿수의 숫자만 교환하여 가장 큰 정수를 만드는 문제
홀수는 홀수끼리, 짝수는 짝수끼리만 교환이 가능하다.


문제를 풀다보니 냅다 n / n+2 애들을 교환했다... 왜인지 답이 도출이 안되더라니만 🥹

내가 잘못한 점

  1. 초기에는 num의 모든 자릿수를 비교하여 조건에 따라 교환하면 된다고 생각했지만 홀수와 짝수 자리를 독립적으로 처리해야 한다 요구사항을 놓침
  2. 숫자를 char로 변환한 뒤 비교하고 교환했지만 캐스팅(int)carr[i]을 사용하여 ASCII 값으로 변환해버린.. 실수
  3. 자릿수를 비교하고 교환하는 단순 반복으로 문제를 해결해보려 했지만 코드의 효율성을 높이기 위해 전체 자릿수에서 홀수와 짝수를 분리하여 각각 내림차순 정렬하는 방식으로 전환했다!

코드 구현하기

import java.util.*;

class Solution {
    public int largestInteger(int num) {
        // 숫자를 자릿수별로 분리
        char[] digits = String.valueOf(num).toCharArray();
        List<Integer> evens = new ArrayList<>();
        List<Integer> odds = new ArrayList<>();

        // 짝수와 홀수 나누기
        for (char c : digits) {
            int digit = c - '0';
            if (digit % 2 == 0) {
                evens.add(digit);
            } else {
                odds.add(digit);
            }
        }

        // 각각 내림차순 정렬
        evens.sort(Collections.reverseOrder());
        odds.sort(Collections.reverseOrder());

        // 원래 순서대로 짝수와 홀수를 결합
        StringBuilder sb = new StringBuilder();
        int evenIndex = 0, oddIndex = 0;

        for (char c : digits) {
            int digit = c - '0';
            if (digit % 2 == 0) {
                sb.append(evens.get(evenIndex++));
            } else {
                sb.append(odds.get(oddIndex++));
            }
        }

        // 결과 반환
        return Integer.parseInt(sb.toString());
    }
}

문제 해결

  • 주어진 숫자를 자릿수로 분리하여 각각 짝수와 홀수로 누고 각 배열을 내림차순으로 정렬
  • 원래 순서를 유지하며 가장 큰 수가 나올 수 있도록 계속하여 재조합한다.
profile
어제의 나보단 나은 오늘의 내가 되기를

0개의 댓글

관련 채용 정보