[Programmers] 숫자 짝꿍

2023. 9. 14. 14:40Computer Sciences/Problem Solve

https://school.programmers.co.kr/learn/courses/30/lessons/131128

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

두 문자열에서 중복된 숫자를 가지고 가장 큰 숫자를 만들어야 한다. 이를 풀기 위해 각 문자열 별로 숫자의 등장 횟수를 저장할 배열을 만든다. 그리고 문자열을 순회하면서 숫자 등장 횟수를 체크한다. 그 다음에 9에서부터 내림차순으로 루프를 돌면서 x[i]와 y[i] 중 더 작은 값만큼, 즉 두 문자열에서 해당 문자가 중복된 횟수만큼 문자열에 추가한다. 만약 문자열의 길이가 0이라면 아무 문자도 중복되지 않은 것이므로 -1을 반환한다. 만약 문자열의 첫 문자가 0이라면 해당 문자열은 0이라는 뜻이다. 왜냐하면 9부터 내려왔기 때문에 첫 문자가 0인 경우는 0, 00, 000 등의 경우밖에 없기 때문이다. 이 경우 0을 반환한다. 그 외의 경우 여러 숫자로 구성된 문자열을 반환한다. 처음에는 Integer.parseInt(String.valueOf(sb.toString()))과 같은 방법으로 0을 제거했는데 문제 조건의 정답 문자열 길이가 최대 3백만이었다. 이는 곧 Integer나 Long으로 변경한다면 오버플로우 문제가 발생한다는 뜻이다. 따라서 이러한 방법으로 문제를 해결했다.

코드

class Solution {
    public String solution(String X, String Y) {
        int[] x = new int[10];
        int[] y = new int[10];
        
        for (int i = 0; i < X.length(); i++) {
            x[X.charAt(i) - '0'] += 1;
        }
        
        for (int i = 0; i < Y.length(); i++) {
            y[Y.charAt(i) - '0'] += 1;
        }
        
        StringBuilder sb = new StringBuilder();
        for (int i = 9; i >= 0; i--) {
            for (int j = 0; j < Math.min(x[i], y[i]); j++) {
                sb.append(i);
            }
        }
        
        if (sb.length() == 0) {
            return "-1";
        }
        
        if (sb.charAt(0) == '0') {
            return "0";
        }

        String answer = sb.toString();
        return answer;
    }
}