[문자열] [프로그래머스] 숫자 짝꿍 (Java)

eunsil·2024년 8월 13일
0

문제: 프로그래머스 - 숫자 짝꿍

문제



실패

풀이

  • 두 문자열에 동일하게 존재하는 숫자를 찾기 위해서 X를 HashSet에 넣고,
  • Y만큼 반복을 돌며 중복되는 숫자만 list에 담고,
  • 정렬 후 list에 있는 숫자를 StringBuilder로 붙인 뒤 반환

코드

import java.util.*;

public class Main {
    public String solution(String X, String Y) {
        Set<Character> set = new HashSet<>();
        for (int i = 0; i < x.length(); i++) {
            set.add(x.charAt(i));
        }

		/*
        X, Y 둘 다 존재하는 숫자 찾기
        */
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < y.length(); i++) {
            if (set.contains(y.charAt(i))) {
                list.add(Character.getNumericValue(y.charAt(i)));
            }
        }
        
        /*
        정렬
        */
        Collections.sort(list, Collections.reverseOrder());

		/*
        정답 만들기
        */
        StringBuilder sb = new StringBuilder();
        for (int n : list) {
            sb.append(n);
        }

		/*
        결과
        */
        String answer = sb.toString();
        if (answer.isEmpty()) {
            return "-1";
        }
        
        if (answer.charAt(0) == '0') {
            return "0";
        }
        
        return answer;
    }
}



성공

풀이

  1. X와 Y에서 존재하는 숫자가 몇 개인지 파악 → arr[숫자]++
  2. 인덱스 9부터 0까지 숫자 개수만큼 StringBuilder로 붙이기 → 9부터 시작하기 때문에 정렬 필요 없음
  3. 붙인 숫자는 개수 감소 → arr[숫자]--

이번 문제의 핵심은 입력 값을 잘 파악해 불필요한 반복을 줄이고, 여러 개의 문자열을 하나로 만들 때 주의하는 것 같다.

만약 StringBuilder가 아닌 String을 계속 이어 붙였으면 String Constant Pool에 많은 문자열 리터럴이 생겨 불필요한 메모리를 점유했을 것이다.

StringBuilder는 가변 객체이므로 이때 사용하기 적합하다.



코드

import java.util.*;

class Solution {
    public String solution(String X, String Y) {
        int[] xArr = new int[10];
        int[] yArr = new int[10];

        /*
        숫자 개수 파악
         */
        for (String x : X.split("")) {
            xArr[Integer.parseInt(x)]++;
        }

        for (String y : Y.split("")) {
            yArr[Integer.parseInt(y)]++;
        }

        /*
        9부터 0까지 존재하는 숫자의 개수 만큼 sb에 붙이기
         */
        StringBuilder sb = new StringBuilder();
        
        for (int i = 9; i >= 0; i--) {
            while (xArr[i] > 0 && yArr[i] > 0) {
                sb.append(i);
                xArr[i]--;
                yArr[i]--;
            }
        }

        /*
        결과 출력
        */
        String answer = sb.toString();
        
        if (answer.isEmpty()) {
            return "-1";
        }
        
        if (answer.charAt(0) == '0') {
            return "0";
        }
        
        return answer;
    }
}

0개의 댓글