본문 바로가기

프로그래머스(Java)/Level 1

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

728x90

코드 힌트

  1. 문제 설명
    • 주어진 두 문자열 X와 Y에서 공통으로 포함된 숫자들로 만들 수 있는 가장 큰 숫자를 구하는 문제입니다.
  2. 자릿수 배열 생성
    • 각 문자열에서 숫자의 빈도를 저장할 배열을 생성합니다.
    • int[] x = new int[10]; : X 문자열에 대해 0부터 9까지 각 숫자의 빈도를 저장하는 배열입니다.
  3. 빈도 계산
    • X와 Y 문자열의 각 자릿수를 배열에 저장합니다.
    • X 문자열의 경우: for (int i = 0; i < X.length(); i++) { x[X.charAt(i) - '0']++; }
    • Y 문자열의 경우: for (int i = 0; i < Y.length(); i++) { y[Y.charAt(i) - '0']++; }
  4. 최댓값 문자열 생성
    • 9부터 0까지 배열을 돌면서 공통으로 존재하는 숫자를 문자열로 저장합니다.
    • 숫자가 큰 순서대로 비교하여 문자열에 저장하면 최댓값을 만들 수 있습니다.
  5. StringBuilder 사용
    • 문자열을 효율적으로 저장하기 위해 StringBuilder를 사용합니다.
    • StringBuilder는 String과 달리 새로운 값을 추가할 때마다 새로운 메모리를 할당하지 않습니다.
  6. 최종 반환
    • StringBuilder에 저장된 결과를 문자열로 변환하여 반환합니다.
    • sb.toString() 메소드를 사용합니다.
  7. 추가 연습
    • 이 문제는 HashMap을 사용하여 풀 수도 있으므로, 연습이 필요하신 분들은 HashMap을 사용한 방법으로도 풀어보시기 바랍니다.
    • HashMap으로 푸는 방법도 정답에 같이 적어놓겠습니다.

 


정답은 더보기 클릭

더보기
class Solution {
    public String solution(String X, String Y) {
        // 결과를 저장할 StringBuilder
        StringBuilder sb = new StringBuilder();
        
        // 각 숫자의 빈도를 저장할 배열
        int[] x = new int[10];
        int[] y = new int[10];
        
        // X 문자열에서 각 숫자의 빈도를 세어 x 배열에 저장
        for (int i = 0; i < X.length(); i++) {
            x[X.charAt(i) - '0']++;
        }
        
        // Y 문자열에서 각 숫자의 빈도를 세어 y 배열에 저장
        for (int i = 0; i < Y.length(); i++) {
            y[Y.charAt(i) - '0']++;
        }
        
        // 9부터 0까지 숫자를 비교하여 공통으로 존재하는 숫자를 StringBuilder에 추가
        for (int i = 9; i >= 0; i--) {
            int count = Math.min(x[i], y[i]);
            for (int j = 0; j < count; j++) {
                sb.append(i);
            }
        }
        
        // 공통 숫자가 없다면 -1 반환
        if (sb.length() == 0) {
            return "-1";
        }
        // 결과가 0으로만 이루어져 있다면 0 반환
        else if (sb.charAt(0) == '0') {
            return "0";
        }
        // 결과 문자열 반환
        return sb.toString();
    }
}

 

HashMap으로 풀기

import java.util.*;

class Solution {
    public String solution(String X, String Y) {
        // 결과를 저장할 StringBuilder
        StringBuilder sb = new StringBuilder();
        
        // 각 문자열의 문자 빈도를 저장할 HashMap
        HashMap<Character, Integer> mapX = new HashMap<>();
        HashMap<Character, Integer> mapY = new HashMap<>();
        
        // X 문자열에서 각 문자의 빈도를 계산하여 mapX에 저장
        for (int i = 0; i < X.length(); i++) {
            mapX.merge(X.charAt(i), 1, Integer::sum);
        }
        
        // Y 문자열에서 각 문자의 빈도를 계산하여 mapY에 저장
        for (int i = 0; i < Y.length(); i++) {
            mapY.merge(Y.charAt(i), 1, Integer::sum);
        }
        
        // mapX의 keySet을 리스트로 변환하여 key를 정렬 (내림차순)
        List<Character> keySet = new ArrayList<>(mapX.keySet());
        keySet.sort((o1, o2) -> o2 - o1);
        
        // 정렬된 key를 이용해 결과 문자열을 생성
        for (char key : keySet) {
            // 각 key의 빈도를 비교하여 공통으로 존재하는 숫자만큼 sb에 추가
            int count = Math.min(mapX.get(key), mapY.getOrDefault(key, 0));
            for (int i = 0; i < count; i++) {
                sb.append(key);
            }
        }
        
        // 결과 문자열이 비어있는 경우 "-1" 반환
        if (sb.length() == 0) {
            return "-1";
        }
        
        // 결과 문자열이 "0"으로만 이루어져 있는 경우 "0" 반환
        if (sb.charAt(0) == '0') {
            return "0";
        }
        
        // 결과 문자열 반환
        return sb.toString();
    }
}
728x90