Light Blue Pointer
본문 바로가기
Coding Test

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

by Greedy 2023. 12. 12.

문제 주소

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

 

프로그래머스

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

programmers.co.kr

문제 설명

두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.

예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)

두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.

제한사항

  • 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
  • X, Y는 0으로 시작하지 않습니다.
  • X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

입출력 예

X Y result

"100" "2345" "-1"
"100" "203045" "0"
"100" "123450" "10"
"12321" "42531" "321"
"5525" "1255" "552"

입출력 예 설명

입출력 예 #1

  • X, Y의 짝꿍은 존재하지 않습니다. 따라서 "-1"을 return합니다.

입출력 예 #2

  • X, Y의 공통된 숫자는 0으로만 구성되어 있기 때문에, 두 수의 짝꿍은 정수 0입니다. 따라서 "0"을 return합니다.

입출력 예 #3

  • X, Y의 짝꿍은 10이므로, "10"을 return합니다.

입출력 예 #4

  • X, Y의 짝꿍은 321입니다. 따라서 "321"을 return합니다.

입출력 예 #5

  • 지문에 설명된 예시와 같습니다.

풀이과정

⭐sort ArrayList

Collections.sort(list);
ArrayList를 오름차순으로 정렬합니다.
 
Collections.sort(list, Collections.reverseOrder());
Collections.sort()의 2번째 파라미터로
내림차순 정렬을 나타내는 Comparator를 전달해서,
ArrayList를 내림차순으로 정렬하였습니다.
 
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
String.CASE_INSENSITIVE_ORDER 를 전달하면, 대소문자 구분없이 오름차순으로 정렬됩니다.
여기서 'a'와 'A'는 같은 순위로 취급되므로, 원래의 순서를 유지합니다.
 
Collections.sort(list, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
대소문자 구분없이, 내림차순으로 정렬합니다.
import java.util.ArrayList;
import java.util.Collections;
class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        ArrayList<String> common = new ArrayList<String>();
        for(int i = 0; i<X.length(); i++){
            String target = "" + X.charAt(i);
            if(Y.contains(target)){
                Y.replaceFirst(target,"");
                common.add(target);
            }
        }
        
        Collections.sort(common,Collections.reverseOrder());
        for(int i = 0; i<common.size(); i++){
            answer += common.get(i);
        }
        return answer;
    }
}
테스트 1
입력값 〉	"100", "2345"
기댓값 〉	"-1"
실행 결과 〉	실행한 결괏값 ""이 기댓값 "-1"과 다릅니다.
테스트 2
입력값 〉	"100", "203045"
기댓값 〉	"0"
실행 결과 〉	실행한 결괏값 "00"이 기댓값 "0"과 다릅니다.
테스트 3
입력값 〉	"100", "123450"
기댓값 〉	"10"
실행 결과 〉	실행한 결괏값 "100"이 기댓값 "10"과 다릅니다.
테스트 4
입력값 〉	"12321", "42531"
기댓값 〉	"321"
실행 결과 〉	실행한 결괏값 "32211"이 기댓값 "321"과 다릅니다.
테스트 5
입력값 〉	"5525", "1255"
기댓값 〉	"552"
실행 결과 〉	실행한 결괏값 "5552"이 기댓값 "552"과 다릅니다.

아 일단 -1이랑 0인 케이스 분류해봄

import java.util.ArrayList;
import java.util.Collections;
class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        ArrayList<String> common = new ArrayList<String>();
        for(int i = 0; i<X.length(); i++){
            String target = "" + X.charAt(i);
            if(Y.contains(target)){
                Y.replaceFirst(target,"");
                common.add(target);
            }
        }
        Collections.sort(common,Collections.reverseOrder());
        if(common.size()==0){
            return "-1";
        }else if(common.get(0).equals("0")){
            return "0";
        }
        for(int i = 0; i<common.size(); i++){
            answer += common.get(i);
        }
        return answer;
    }
}
테스트 1
입력값 〉	"100", "2345"
기댓값 〉	"-1"
실행 결과 〉	테스트를 통과하였습니다.
테스트 2
입력값 〉	"100", "203045"
기댓값 〉	"0"
실행 결과 〉	테스트를 통과하였습니다.
테스트 3
입력값 〉	"100", "123450"
기댓값 〉	"10"
실행 결과 〉	실행한 결괏값 "100"이 기댓값 "10"과 다릅니다.
테스트 4
입력값 〉	"12321", "42531"
기댓값 〉	"321"
실행 결과 〉	실행한 결괏값 "32211"이 기댓값 "321"과 다릅니다.
테스트 5
입력값 〉	"5525", "1255"
기댓값 〉	"552"
실행 결과 〉	실행한 결괏값 "5552"이 기댓값 "552"과 다릅니다.

아니 또 실수함

⚠️replace하고 String에 안 넣어주시면 안됩니다

Y.replaceFirst(target,"");

Y = Y.replaceFirst(target,"");

제발.’…

고쳐봄

import java.util.ArrayList;
import java.util.Collections;
class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        ArrayList<String> common = new ArrayList<String>();
        for(int i = 0; i<X.length(); i++){
            String target = "" + X.charAt(i);
            if(Y.contains(target)){
                Y = Y.replaceFirst(target,"");
                common.add(target);
            }
        }
        Collections.sort(common,Collections.reverseOrder());
        if(common.size()==0){
            return "-1";
        }else if(common.get(0).equals("0")){
            return "0";
        }
        for(int i = 0; i<common.size(); i++){
            answer += common.get(i);
        }
        return answer;
    }
}

테스트 1 〉 통과 (8.26ms, 70.5MB)

테스트 2 〉 통과 (6.76ms, 77.1MB)
테스트 3 〉 통과 (6.42ms, 76.6MB)
테스트 4 〉 통과 (6.48ms, 75.6MB)
테스트 5 〉 통과 (6.91ms, 66.6MB)
테스트 6 〉 통과 (22.86ms, 93.4MB)
테스트 7 〉 통과 (13.32ms, 79.6MB)
테스트 8 〉 통과 (18.47ms, 83.3MB)
테스트 9 〉 통과 (13.01ms, 75MB)
테스트 10 〉 통과 (19.34ms, 78MB)
테스트 11 〉 실패 (시간 초과)
테스트 12 〉 실패 (시간 초과)
테스트 13 〉 실패 (시간 초과)
테스트 14 〉 실패 (시간 초과)
테스트 15 〉 실패 (시간 초과)
테스트 16 〉 통과 (5.89ms, 77.7MB)
테스트 17 〉 통과 (6.96ms, 78.3MB)
테스트 18 〉 통과 (7.61ms, 75.7MB)
테스트 19 〉 통과 (6.91ms, 74.6MB)

ㅎㅎ 시간초과뜸 이걸 어떻게 해결하지

일단 common String에 넣었다가 char array로 바꿔서 정렬하는게 낫겠음

 

⭐java String to charArray

String s = "GeeksForGeeks";
char[] gfg = s.toCharArray();

⭐java arrays.sort()

Arrays.sort(arr);
import java.util.Arrays;
class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        String common = "";
        for(int i = 0; i<X.length(); i++){
            String target = "" + X.charAt(i);
            if(Y.contains(target)){
                Y = Y.replaceFirst(target,"");
                common+=target;
            }
        }
        
        if(common.length()==0){
            return "-1";
        }
        char [] commonArr = common.toCharArray();
        Arrays.sort(commonArr);
        if(common.charAt(commonArr.length-1)=='0'){
            return "0";
        }
        for(int i = commonArr.length-1; i>=0; i--){
            answer +=  commonArr[i];
        }
        return answer;
    }
}
테스트 1
입력값 〉	"100", "2345"
기댓값 〉	"-1"
실행 결과 〉	테스트를 통과하였습니다.
테스트 2
입력값 〉	"100", "203045"
기댓값 〉	"0"
실행 결과 〉	테스트를 통과하였습니다.
테스트 3
입력값 〉	"100", "123450"
기댓값 〉	"10"
실행 결과 〉	실행한 결괏값 "0"이 기댓값 "10"과 다릅니다.
테스트 4
입력값 〉	"12321", "42531"
기댓값 〉	"321"
실행 결과 〉	테스트를 통과하였습니다.
테스트 5
입력값 〉	"5525", "1255"
기댓값 〉	"552"
실행 결과 〉	테스트를 통과하였습니다.

지금보니까 sort는 commonArr로 하고 common에서 맨 뒤에 char이 0인지 읽고있음 sort도 안 되어있는데 ㅋㅋ

import java.util.Arrays;
class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        String common = "";
        for(int i = 0; i<X.length(); i++){
            String target = "" + X.charAt(i);
            if(Y.contains(target)){
                Y = Y.replaceFirst(target,"");
                common+=target;
            }
        }
        
        if(common.length()==0){
            return "-1";
        }
        char [] commonArr = common.toCharArray();
        Arrays.sort(commonArr);
        if(commonArr[commonArr.length-1]=='0'){
            return "0";
        }
        for(int i = commonArr.length-1; i>=0; i--){
            answer +=  commonArr[i];
        }
        return answer;
    }
}
테스트 1 〉	통과 (17.97ms, 71.5MB)
테스트 2 〉	통과 (13.61ms, 83.5MB)
테스트 3 〉	통과 (29.86ms, 80.3MB)
테스트 4 〉	통과 (19.04ms, 69.6MB)
테스트 5 〉	통과 (20.74ms, 87.7MB)
테스트 6 〉	통과 (27.32ms, 78.3MB)
테스트 7 〉	통과 (23.62ms, 74.8MB)
테스트 8 〉	통과 (31.05ms, 87.2MB)
테스트 9 〉	통과 (25.50ms, 79MB)
테스트 10 〉	통과 (32.29ms, 78.9MB)
테스트 11 〉	실패 (시간 초과)
테스트 12 〉	실패 (시간 초과)
테스트 13 〉	실패 (시간 초과)
테스트 14 〉	실패 (시간 초과)
테스트 15 〉	실패 (시간 초과)
테스트 16 〉	통과 (8.56ms, 80MB)
테스트 17 〉	통과 (7.16ms, 74.2MB)
테스트 18 〉	통과 (5.68ms, 75.2MB)
테스트 19 〉	통과 (12.07ms, 83.6MB)

ㅎㅎ 여전히 이러네 처음부터 String 말고 char Array로 한번 바꿔봄

import java.util.Arrays;
class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        String common = "";
        
        char [] xArr = X.toCharArray();        
        
        for(int i = 0; i<xArr.length; i++){
            String target = "" + xArr[i];
            if(Y.contains(target)){
                Y = Y.replaceFirst(target,"");
                common+=target;
            }
        }
        
        if(common.length()==0){
            return "-1";
        }
        char [] commonArr = common.toCharArray();
        Arrays.sort(commonArr);
        if(commonArr[commonArr.length-1]=='0'){
            return "0";
        }
        for(int i = commonArr.length-1; i>=0; i--){
            answer +=  commonArr[i];
        }
        return answer;
    }
}
테스트 1 〉	통과 (17.89ms, 88.7MB)
테스트 2 〉	통과 (18.42ms, 76.9MB)
테스트 3 〉	통과 (12.40ms, 80.6MB)
테스트 4 〉	통과 (17.64ms, 80.2MB)
테스트 5 〉	통과 (13.06ms, 76.5MB)
테스트 6 〉	통과 (21.42ms, 83MB)
테스트 7 〉	통과 (20.85ms, 77.8MB)
테스트 8 〉	통과 (27.49ms, 88.1MB)
테스트 9 〉	통과 (15.89ms, 81.5MB)
테스트 10 〉	통과 (35.92ms, 72.9MB)
테스트 11 〉	실패 (시간 초과)
테스트 12 〉	실패 (시간 초과)
테스트 13 〉	실패 (시간 초과)
테스트 14 〉	실패 (시간 초과)
테스트 15 〉	실패 (시간 초과)
테스트 16 〉	통과 (6.01ms, 85.3MB)
테스트 17 〉	통과 (7.22ms, 70.8MB)
테스트 18 〉	통과 (5.61ms, 78.7MB)
테스트 19 〉	통과 (6.23ms, 78.6MB)

replace말고 charArray를 써야할까봐 ㅎ

읽고나서 그냥 거기를 숫자 말고 이상한걸로 넣어두면 다시 비교하고 count할 일 없잖아

아 아니다 그냥 arrayList 써서 remove하는게 원소가 줄어가서 제일 빠르겠다

같은거 찾으면 break하고

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of bounds for length 3

at java.base/java.util.ArrayList.get(ArrayList.java:427)

-. i랑 j 또 헷갈려서 j 써야되는 데에 i써놓음 ㅎ

import java.util.Arrays;
import java.util.ArrayList;
class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        String common = "";
        
        char [] xArr = X.toCharArray();   
        //char [] yArr = Y.toCharArray(); 
        ArrayList<String> yArr = new ArrayList<String>();
        for(int i = 0; i<Y.length(); i++){
            yArr.add(""+Y.charAt(i));
        }
        
        for(int i = 0; i<xArr.length; i++){
            for(int j = 0; j<yArr.size(); j++){
                if(yArr.get(j).equals(""+xArr[i])){
                    yArr.remove(j);
                    common += xArr[i];
                    break;
                }
            }
        }
        
        if(common.length()==0){
            return "-1";
        }
        char [] commonArr = common.toCharArray();
        Arrays.sort(commonArr);
        if(commonArr[commonArr.length-1]=='0'){
            return "0";
        }
        for(int i = commonArr.length-1; i>=0; i--){
            answer +=  commonArr[i];
        }
        return answer;
    }
}
테스트 1 〉	통과 (18.30ms, 76MB)
테스트 2 〉	통과 (16.65ms, 82.2MB)
테스트 3 〉	통과 (22.26ms, 92.6MB)
테스트 4 〉	통과 (16.59ms, 75.9MB)
테스트 5 〉	통과 (16.18ms, 72.8MB)
테스트 6 〉	통과 (36.95ms, 73MB)
테스트 7 〉	통과 (42.94ms, 78.4MB)
테스트 8 〉	통과 (43.90ms, 72.1MB)
테스트 9 〉	통과 (25.49ms, 87.6MB)
테스트 10 〉	통과 (26.14ms, 73.4MB)
테스트 11 〉	실패 (시간 초과)
테스트 12 〉	실패 (시간 초과)
테스트 13 〉	실패 (시간 초과)
테스트 14 〉	실패 (시간 초과)
테스트 15 〉	실패 (시간 초과)
테스트 16 〉	통과 (14.84ms, 74.5MB)
테스트 17 〉	통과 (12.08ms, 73.5MB)
테스트 18 〉	통과 (6.96ms, 76.5MB)
테스트 19 〉	통과 (8.50ms, 77.8MB)

오 근데 아까보다 더 느려졌음

걍 char배열로 한번 해본다

import java.util.Arrays;
import java.util.ArrayList;
class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        String common = "";
        
        char [] xArr = X.toCharArray();   
        char [] yArr = Y.toCharArray(); 
        //ArrayList<String> yArr = new ArrayList<String>();
        // for(int i = 0; i<Y.length(); i++){
        //     yArr.add(""+Y.charAt(i));
        // }
        
        for(int i = 0; i<xArr.length; i++){
            for(int j = 0; j<yArr.length; j++){
                if(yArr[j]==xArr[i]){
                    yArr[j]= '%';
                    common += xArr[i];
                    break;
                }
            }
        }
        
        if(common.length()==0){
            return "-1";
        }
        char [] commonArr = common.toCharArray();
        Arrays.sort(commonArr);
        if(commonArr[commonArr.length-1]=='0'){
            return "0";
        }
        for(int i = commonArr.length-1; i>=0; i--){
            answer +=  commonArr[i];
        }
        return answer;
    }
}
테스트 1 〉	통과 (9.48ms, 84.3MB)
테스트 2 〉	통과 (14.05ms, 82.1MB)
테스트 3 〉	통과 (12.99ms, 80.3MB)
테스트 4 〉	통과 (33.36ms, 68.6MB)
테스트 5 〉	통과 (16.26ms, 80.8MB)
테스트 6 〉	통과 (25.24ms, 81.4MB)
테스트 7 〉	통과 (16.32ms, 73.6MB)
테스트 8 〉	통과 (33.54ms, 65.7MB)
테스트 9 〉	통과 (18.26ms, 80.9MB)
테스트 10 〉	통과 (15.02ms, 87.7MB)
테스트 11 〉	실패 (시간 초과)
테스트 12 〉	실패 (시간 초과)
테스트 13 〉	실패 (시간 초과)
테스트 14 〉	실패 (시간 초과)
테스트 15 〉	실패 (시간 초과)
테스트 16 〉	통과 (13.77ms, 78.3MB)
테스트 17 〉	통과 (20.32ms, 79MB)
테스트 18 〉	통과 (0.02ms, 75.4MB)
테스트 19 〉	통과 (0.02ms, 73.2MB)

아까랑 걍 거의 비슷함

크기가 많아질때 어떻게 효과적으로 탐색하지

for문 두번 돌리면 안될거같음 이거

자료구조 공부하고 다시해본다

 

걍 String으로 한번 해봅니다

안됩니다

Map을 써야할 거 같습니다

  • 배열 만들어서 푸는것도 좋은듯

아이디어가 떠오르면 이거저거 시도해보세요…

한 방식만 고집하지 말고

import java.util.HashMap; // import the HashMap class

HashMap<String, String> capitalCities = new HashMap<String, String>();
// Add keys and values (Country, City)
    capitalCities.put("England", "London")
capitalCities.get("England");
capitalCities.remove("England");
capitalCities.clear();
hash_map.containsKey(20));

⭐HashMap이 Key를 포함하고 있는지 아는 법

hash_map.containsKey(20));

⭐**How to update a value, given a key in a hashmap?**

map.put(key, map.get(key) + 1);

how to remove entry from hashmap by Value?

There's a simple method, but it'll use iteration internally. (There's no way around that.)

map.values().remove(valueToRemove);

how to loop through hashmap

for (String key: map.keySet()) {
    System.out.println("key : " + key);
    System.out.println("value : " + map.get(key));
}

how to sort hashmap

Sorting a Hashmap according to values

// function to sort hashmap by values
    public static HashMap<String, Integer> sortByValue(HashMap<String, Integer> hm)
    {
        // Create a list from elements of HashMap
        List<Map.Entry<String, Integer> > list =
               new LinkedList<Map.Entry<String, Integer> >(hm.entrySet());
 
        // Sort the list
        Collections.sort(list, new Comparator<Map.Entry<String, Integer> >() {
            public int compare(Map.Entry<String, Integer> o1, 
                               Map.Entry<String, Integer> o2)
            {
                return (o1.getValue()).compareTo(o2.getValue());
            }
        });
         
        // put data from sorted list to hashmap 
        HashMap<String, Integer> temp = new LinkedHashMap<String, Integer>();
        for (Map.Entry<String, Integer> aa : list) {
            temp.put(aa.getKey(), aa.getValue());
        }
        return temp;
    }

정렬 너무 일이 커지는데 어차피 숫자는 9부터밖에 없으니까

9부터 세어보자

Key existence check in HashMap

Foo value = map.get(key);
if (value != null) {
    ...
} else {
    // Key might be present...
    if (map.containsKey(key)) {
       // Okay, there's a key but the value is null
    } else {
       // Definitely no such key
    }
}
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
    public String solution(String X, String Y) {
        
        HashMap<String, String> couples = new HashMap<String, String>();
        
        for(int i=0;i<X.length();i++){
            couples.put((""+X.charAt(i)),"-1");
        }
        for(int i=0;i<Y.length();i++){
            if(couples.containsKey((""+Y.charAt(i)))){
                couples.put((""+Y.charAt(i)),(""+Y.charAt(i)));
            }
        }
        couples.values().remove("-1");
        if(couples.size()<0){
            return "-1";
        }
        String answer = "";
        for(int i = 9;i>=0;i--){
            while(couples.containsKey(Integer.toString(i))){
                answer += i;
                couples.remove(Integer.toString(i));  
            }
        }
        if(answer.charAt(0)=='0'){
            return "0";
        }

        return answer;
    }
        
}
테스트 1
입력값 〉	"100", "2345"
기댓값 〉	"-1"
실행 결과 〉	실행한 결괏값 "1"이 기댓값 "-1"과 다릅니다.
테스트 2
입력값 〉	"100", "203045"
기댓값 〉	"0"
실행 결과 〉	테스트를 통과하였습니다.
테스트 3
입력값 〉	"100", "123450"
기댓값 〉	"10"
실행 결과 〉	테스트를 통과하였습니다.
테스트 4
입력값 〉	"12321", "42531"
기댓값 〉	"321"
실행 결과 〉	테스트를 통과하였습니다.
테스트 5
입력값 〉	"5525", "1255"
기댓값 〉	"552"
실행 결과 〉	실행한 결괏값 "52"이 기댓값 "552"과 다릅니다.

5의 경우에 중복되는 숫자가 안 꺼내지는 거 같음

Hashmap.get을 더 알아보자 put에 중복도 들어가는거 맞지?

Java: How to get set of keys having same value in hashmap

근데 굳이 저렇게 안 하고 couple이면 숫자를 올리면 되잖아

import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
    public String solution(String X, String Y) {
        
        HashMap<String, String> couples = new HashMap<String, String>();
        
        for(int i=0;i<X.length();i++){
            couples.put((""+X.charAt(i)),"0");
        }
        for(int i=0;i<Y.length();i++){
            if(couples.containsKey((""+Y.charAt(i)))){
                couples.put((""+Y.charAt(i)),(couples.get(""+Y.charAt(i))++));
            }
        }
        couples.values().remove("0");
        if(couples.size()<0){
            return "-1";
        }
        String answer = "";
        for(int i = 9;i>=0;i--){
            while(couples.containsKey(Integer.toString(i))){
                answer += Integer.toString(i).repeat(couples.get(Integer.toString(i)));
                couples.remove(Integer.toString(i));  
            }
        }
        if(answer.charAt(0)=='0'){
            return "0";
        }

        return answer;
    }
        
}
import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
    public String solution(String X, String Y) {
        
        HashMap<String, String> couples = new HashMap<String, String>();
        
        for(int i=0;i<X.length();i++){
            couples.put((""+X.charAt(i)),"0");
        }
        for(int i=0;i<Y.length();i++){
            if(couples.containsKey((""+Y.charAt(i)))){
                int count = Integer.parseInt(couples.get(""+Y.charAt(i)));
                count++;
                couples.put((""+Y.charAt(i)),Integer.toString(count));
            }
        }
        couples.values().remove("0");
        if(couples.size()<0){
            return "-1";
        }
        String answer = "";
        for(int i = 9;i>=0;i--){
            if(couples.containsKey(Integer.toString(i))){
                int count = Integer.parseInt(couples.get(Integer.parseInt(i)));
                answer += Integer.toString(i).repeat(count);
                couples.remove(Integer.toString(i));  
            }
        }
        if(answer.charAt(0)=='0'){
            return "0";
        }

        return answer;
    }
        
}

/Solution.java:26: error: incompatible types: int cannot be converted to String

int count = Integer.parseInt(couples.get(Integer.parseInt(i)));

^

Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output

1 error

import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
    public String solution(String X, String Y) {
        
        HashMap<String, String> couples = new HashMap<String, String>();
        
        for(int i=0;i<X.length();i++){
            couples.put((""+X.charAt(i)),"0");
        }
        for(int i=0;i<Y.length();i++){
            if(couples.containsKey((""+Y.charAt(i)))){
                int count = Integer.parseInt(couples.get(""+Y.charAt(i)));
                count++;
                couples.put((""+Y.charAt(i)),Integer.toString(count));
            }
        }
        couples.values().remove("0");
        if(couples.size()==0){
            return "-1";
        }
        String answer = "";
        for(int i = 9;i>=0;i--){
            if(couples.containsKey(Integer.toString(i))){
                int count = Integer.parseInt(couples.get(Integer.toString(i)));
                answer += Integer.toString(i).repeat(count);
                couples.remove(Integer.toString(i));  
            }
        }
        if(answer.charAt(0)=='0'){
            return "0";
        }

        return answer;
    }
        
}
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 0
	at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)
	at java.base/java.lang.String.charAt(String.java:711)
	at Solution.solution(Unknown Source)
	at SolutionTest.lambda$main$0(Unknown Source)
	at SolutionTest$SolutionRunner.run(Unknown Source)
	at SolutionTest.main(Unknown Source)

테스트 결과 (~˘▾˘)~
5개 중 4개 성공

저기서 왜 오류가 나지..?

import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
    public String solution(String X, String Y) {
        
        HashMap<String, String> couples = new HashMap<String, String>();
        
        for(int i=0;i<X.length();i++){
            couples.put((""+X.charAt(i)),"0");
        }
        for(int i=0;i<Y.length();i++){
            if(couples.containsKey((""+Y.charAt(i)))){
                int count = Integer.parseInt(couples.get(""+Y.charAt(i)));
                count++;
                couples.put((""+Y.charAt(i)),Integer.toString(count));
            }
        }
        couples.values().remove("0");
        if(couples.size()==0){
            return "-1";
        }
        String answer = "";
        for(int i = 9;i>=0;i--){
            if(couples.containsKey(Integer.toString(i))){
                int count = Integer.parseInt(couples.get(Integer.toString(i)));
                answer += Integer.toString(i).repeat(count);
                couples.remove(Integer.toString(i));  
            }
        }
        // if(answer.charAt(0)=='0'){
        //     return "0";
        // }

        return answer;
    }
        
}

저부분 주석처리했더니 괜찮아짐

테스트 1
입력값 〉	"100", "2345"
기댓값 〉	"-1"
실행 결과 〉	실행한 결괏값 ""이 기댓값 "-1"과 다릅니다.
테스트 2
입력값 〉	"100", "203045"
기댓값 〉	"0"
실행 결과 〉	실행한 결괏값 "00"이 기댓값 "0"과 다릅니다.
테스트 3
입력값 〉	"100", "123450"
기댓값 〉	"10"
실행 결과 〉	테스트를 통과하였습니다.
테스트 4
입력값 〉	"12321", "42531"
기댓값 〉	"321"
실행 결과 〉	테스트를 통과하였습니다.
테스트 5
입력값 〉	"5525", "1255"
기댓값 〉	"552"
실행 결과 〉	테스트를 통과하였습니다.
if(couples.size()==0){
            return "-1";
        }

이 부분이 안 읽어지고 넘어가져서 “-1” 리턴하는 대신 “”가 넘어간 다음 charAt(0)에서 걸리는 거 같음

java hashmap size

import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
    public String solution(String X, String Y) {
        
        HashMap<String, String> couples = new HashMap<String, String>();
        
        for(int i=0;i<X.length();i++){
            couples.put((""+X.charAt(i)),"0");
        }
        for(int i=0;i<Y.length();i++){
            if(couples.containsKey((""+Y.charAt(i)))){
                int count = Integer.parseInt(couples.get(""+Y.charAt(i)));
                count++;
                couples.put((""+Y.charAt(i)),Integer.toString(count));
            }
        }
        couples.values().remove("0");
        // if(couples.size()==0){
        //     return "-1";
        // }
        String answer = "";
        for(int i = 9;i>=0;i--){
            if(couples.containsKey(Integer.toString(i))){
                int count = Integer.parseInt(couples.get(Integer.toString(i)));
                answer += Integer.toString(i).repeat(count);
                couples.remove(Integer.toString(i));  
            }
        }
        if(answer.equals("")){
            return "-1";
        }
        if(answer.charAt(0)=='0'){
            return "0";
        }
        return answer;
    }
        
}

그냥 저렇게 맞춰보긴 함

테스트 1 〉	통과 (9.46ms, 69.8MB)
테스트 2 〉	통과 (12.60ms, 72.7MB)
테스트 3 〉	실패 (8.36ms, 76.3MB)
테스트 4 〉	통과 (8.88ms, 77MB)
테스트 5 〉	실패 (8.36ms, 74.8MB)
테스트 6 〉	통과 (12.15ms, 75.5MB)
테스트 7 〉	통과 (10.63ms, 73.7MB)
테스트 8 〉	실패 (10.74ms, 78.4MB)
테스트 9 〉	통과 (7.53ms, 81.2MB)
테스트 10 〉	실패 (8.53ms, 75.1MB)
테스트 11 〉	실패 (560.09ms, 455MB)
테스트 12 〉	실패 (678.04ms, 436MB)
테스트 13 〉	실패 (571.93ms, 427MB)
테스트 14 〉	실패 (573.86ms, 439MB)
테스트 15 〉	실패 (547.73ms, 434MB)
테스트 16 〉	통과 (7.60ms, 78.4MB)
테스트 17 〉	통과 (7.38ms, 77.4MB)
테스트 18 〉	통과 (7.92ms, 79.5MB)
테스트 19 〉	통과 (5.58ms, 80.7MB)

흑흑… 적어도 이제 타임아웃 오류는 안 나네 하지만 수많은 실패가 따흐흑

생각해보니 지금 X에 5가 두개 있으면 두개 넣는데 Y에 5가 3개 있으면 어떻게 되는거지…?

다시 생각을 좀 해봐야 할 거 같다

테스트 5
입력값 〉	"5525", "1255"
기댓값 〉	"552"
실행 결과 〉	테스트를 통과하였습니다.

희한하네 이거 왜 되고 있는거임

뭔가 좀 이상해서 코드를 바꿔봄

import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
    public String solution(String X, String Y) {
        
        HashMap<String, String> couples = new HashMap<String, String>();
        HashMap<String, String> counts = new HashMap<String, String>();
        
        
        for(int i=0;i<X.length();i++){
            couples.put((""+X.charAt(i)),"0");
            if(!counts.containsKey(""+X.charAt(i))){
                counts.put((""+X.charAt(i)),"0");
            }
        }
        for(int i=0;i<Y.length();i++){
            if(couples.containsKey((""+Y.charAt(i)))){
                int count = Integer.parseInt(couples.get(""+Y.charAt(i)));
                if(count==0){
                    count++;
                    couples.remove(""+Y.charAt(i));
                    counts.put((""+Y.charAt(i)),Integer.toString(count));
                }
                
            }
        }
        counts.values().remove("0");
        // if(counts.size()==0){
        //     return "-1";
        // }
        String answer = "";
        for(int i = 9;i>=0;i--){
            if(counts.containsKey(Integer.toString(i))){
                int count = Integer.parseInt(counts.get(Integer.toString(i)));
                answer += Integer.toString(i).repeat(count);
                counts.remove(Integer.toString(i));  
            }
        }
        if(answer.equals("")){
            return "-1";
        }
        if(answer.charAt(0)=='0'){
            return "0";
        }
        return answer;
    }
        
}
테스트 1
입력값 〉	"100", "2345"
기댓값 〉	"-1"
실행 결과 〉	테스트를 통과하였습니다.
테스트 2
입력값 〉	"100", "203045"
기댓값 〉	"0"
실행 결과 〉	테스트를 통과하였습니다.
테스트 3
입력값 〉	"100", "123450"
기댓값 〉	"10"
실행 결과 〉	테스트를 통과하였습니다.
테스트 4
입력값 〉	"12321", "42531"
기댓값 〉	"321"
실행 결과 〉	테스트를 통과하였습니다.
테스트 5
입력값 〉	"5525", "1255"
기댓값 〉	"552"
실행 결과 〉	실행한 결괏값 "52"이 기댓값 "552"과 다릅니다.

로그 찍어봄

⭐**How to update a value, given a key in a hashmap?**

map.put(key, map.get(key) + 1);

put을 해봤자 중복된 값은 안 들어갈 거 같아

테스트 5
입력값 〉	"5525", "1255"
기댓값 〉	"552"
실행 결과 〉	실행한 결괏값 "52"이 기댓값 "552"과 다릅니다.
출력 〉	
key:2count:1
key:5count:1 -> key:5 count:2가 되어야 함
out
key:5count:1
answer5
key:2count:1
answer52

생각을 정리해 봄

in

X돌면서

일단 Xcounts Hashmap에 몇개인지 넣어줌

out

Y돌면서

Ycounts에 더해보기, Xcounts의 값보다 커질 수 없음

Ycounts에서 꺼내보기

import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
    public String solution(String X, String Y) {
        
        HashMap<String, String> Xcounts = new HashMap<String, String>();
        HashMap<String, String> Ycounts = new HashMap<String, String>();
        
        
        for(int i=0;i<X.length();i++){
            if(!Xcounts.containsKey(""+X.charAt(i))){
                Xcounts.put((""+X.charAt(i)),"1");
            }else{
                int count = Integer.parseInt(Xcounts.get(Integer.toString(i)));
                count++;
                Xcounts.put((""+X.charAt(i)),Integer.toString(count));
            }
        }
        
        for(int i=0;i<Y.length();i++){
            if(Xcounts.containsKey((""+Y.charAt(i)))){
                int countX = Integer.parseInt(Xcounts.get(""+Y.charAt(i)));
                if(Ycounts.containsKey(""+Y.charAt(i))){
                    int countY = Integer.parseInt(Ycounts.get(""+Y.charAt(i)));
                    countY++;
                    if(countY<=countX){
                        Ycounts.put((""+Y.charAt(i)),Integer.toString(countY));
                    }     
                }else{
                    Ycounts.put((""+Y.charAt(i)),"1");
                }   
            }
        }
        
        String answer = "";
        System.out.println("out");
        for(int i = 9;i>=0;i--){
            if(Ycounts.containsKey(Integer.toString(i))){
                int count = Integer.parseInt(Ycounts.get(Integer.toString(i)));
                answer += Integer.toString(i).repeat(count);
                System.out.println("key:"+i+"count:"+count);
                System.out.println("answer"+answer);
                Ycounts.remove(Integer.toString(i));  
            }
        }
        if(answer.equals("")){
            return "-1";
        }
        if(answer.charAt(0)=='0'){
            return "0";
        }
        return answer;
    }
        
}

Exception in thread "main" java.lang.NumberFormatException: null

at java.base/java.lang.Integer.parseInt(Integer.java:614)

integer.parseInt 들을 살펴보기로 함

for(int i=0;i<X.length();i++){
            if(!Xcounts.containsKey(""+X.charAt(i))){
                Xcounts.put((""+X.charAt(i)),"1");
            }else{
                int count = Integer.parseInt(Xcounts.get(Integer.toString(i)));
                count++;
                Xcounts.put((""+X.charAt(i)),Integer.toString(count));
            }
        }

int count = Integer.parseInt(Xcounts.get(""+X.charAt(i)));

이걸로 수정함

됨!!

 

제출 코드

import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
class Solution {
    public String solution(String X, String Y) {
        
        HashMap<String, String> Xcounts = new HashMap<String, String>();
        HashMap<String, String> Ycounts = new HashMap<String, String>();
        
        
        for(int i=0;i<X.length();i++){
            if(!Xcounts.containsKey(""+X.charAt(i))){
                Xcounts.put((""+X.charAt(i)),"1");
            }else{
                int count = Integer.parseInt(Xcounts.get(""+X.charAt(i)));
                count++;
                Xcounts.put((""+X.charAt(i)),Integer.toString(count));
            }
        }
        
        for(int i=0;i<Y.length();i++){
            if(Xcounts.containsKey((""+Y.charAt(i)))){
                int countX = Integer.parseInt(Xcounts.get(""+Y.charAt(i)));
                if(Ycounts.containsKey(""+Y.charAt(i))){
                    int countY = Integer.parseInt(Ycounts.get(""+Y.charAt(i)));
                    countY++;
                    if(countY<=countX){
                        Ycounts.put((""+Y.charAt(i)),Integer.toString(countY));
                    }     
                }else{
                    Ycounts.put((""+Y.charAt(i)),"1");
                }   
            }
        }
        
        String answer = "";
        for(int i = 9;i>=0;i--){
            if(Ycounts.containsKey(Integer.toString(i))){
                int count = Integer.parseInt(Ycounts.get(Integer.toString(i)));
                answer += Integer.toString(i).repeat(count);
                Ycounts.remove(Integer.toString(i));  
            }
        }
        if(answer.equals("")){
            return "-1";
        }
        if(answer.charAt(0)=='0'){
            return "0";
        }
        return answer;
    }
        
}

 

 

 

다른 사람의 풀이

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class Solution {
  public String solution(String X, String Y) {
    Map<String, Integer> mapX = new HashMap<>();
    Map<String, Integer> mapY = new HashMap<>();
    List<String> list = new ArrayList<>();
    for (String key : X.split("")) {
      mapX.put(key, mapX.getOrDefault(key, 0) + 1);
    }
    for (String key : Y.split("")) {
      mapY.put(key, mapY.getOrDefault(key, 0) + 1);
    }
    for (String key : mapX.keySet()) {
      if (mapY.containsKey(key)) {
        int dup = mapX.get(key) - mapY.get(key);
        if (dup >= 0) {
          for (int i = 0; i < mapY.get(key); i++) {
            list.add(key);
          }
        } else {
          for (int i = 0; i < mapX.get(key); i++) {
            list.add(key);
          }
        }
      }
    }
    if (list.isEmpty()) {
      return "-1";
    }
    list.sort((s1, s2) -> s2.compareTo(s1)); // 리스트에 있는 값을 내림차순으로 정렬
    String result = String.join("", list); // 배열을 ""기준으로 합침
    if (result.matches("^[0]+$")) {
      return "0";
    } else {
      return result;
    }
  }
}

개신기함