[Java] 프로그래머스 : 숫자 짝꿍

728x90

[Java] 프로그래머스 : 숫자 짝꿍

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

 

프로그래머스

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

programmers.co.kr


접근

주어진 두 수에서 공통으로 나타나는 정수 세 개를 찾아내고, 그 숫자들로 만들 수 있는 가장 큰 세자리 정수가 무엇인지 알아내야 한다. 짝이 없으면 -1을, 짝이 0으로만 구성되면 0을 출력해야 한다.

 

짝을 만들 때, 각각의 값을 기존 값에서 제외시키도록 해야 한다.

예를들어, X = 5525, Y = 1255면 X에는 5가 3개, Y에는 5가 2개이므로 X쪽에 있는 5 하나는 짝을 짓지 못하게 된다.

 

X와 Y의 각 자릿 수가 각각 몇 번 나타나는지 체크하고, 더 작은 값을 취한다면 위의 문제를 해결할 수 있을 것이다.

해시맵을 사용하거나 배열을 사용해서 문제를 푸는 것이 정석인 것 같다.

 

answer는 String 값의 더하기 연산이 필요한 것으로 보아, 단순 문자열 덧셈보다 StringBuilder를 활용하는 것이 효율적으로 보인다.

 

코드

import java.util.*;
class Solution {
    public String solution(String X, String Y) {
        StringBuilder sb = new StringBuilder();
        int[] xArr = new int[10];
        int[] yArr = new int[10];

        for (int i = 0; i < X.length(); i++) {
            xArr[Character.getNumericValue(X.charAt(i))]++; // char to int
        }
        for (int i = 0; i < Y.length(); i++) {
            yArr[Character.getNumericValue(Y.charAt(i))]++;
        }
        
        for (int i = 9; i >= 0; i--) { // 세 정수의 최댓값이므로 역순으로 전개
            for (int j = 0; j < Math.min(xArr[i], yArr[i]); j++) { // 두 값중 최솟값을 취하면 짝이 맞는 최대 숫자를 구할 수 있다.
                sb.append(String.valueOf(i));
            }
        }
        if(sb.toString().equals("")) return "-1";
        else if (sb.toString().charAt(0) == '0') return "0";  // 구해진 답이 00, 000과 같은 경우에 0으로 return 하도록 한다.
        else return sb.toString();
    }
}

 

728x90