아메바개발 2022. 11. 3. 00:32

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

 

프로그래머스

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

programmers.co.kr

문제풀이

X와 Y의 값을 split으로 나누고 이값을 list에 넣은 후 한개씩 비교하여 있는지여부 판단한 후 answerList에 넣는것으로 하였다.. 하지만 테스트 11~15의경우 시간 초과가 나게되었는데 상당히 시간제한이 짧은듯하다.. StringBuilder도 써보고 해봤으나 안되서 다른사람의 코드를 참조하였다. counting sort방식처럼 0~9 배열에 넣어놓고 9부터 순서대로 꺼내는 방식으로 구현하였다.

 

 

 

첫 코드

import java.util.*;
class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        List<String> xList = new ArrayList<>(Arrays.asList(X.split("")));
        List<String> yList = new ArrayList<>(Arrays.asList(Y.split("")));
        List<String> answerList;
        if(xList.size()<yList.size()){
            answerList=getAnswer(xList,yList);
        }else{
            answerList=getAnswer(yList,xList);
        }
        Collections.sort(answerList,Collections.reverseOrder());
        answer =String.join("",answerList);
        if(answer.equals("")){
            return "-1";
        }
        if(answer.startsWith("0")){
            return "0";
        }
        return answer;
    }
    public List<String> getAnswer(List<String> list1,List<String> list2){
        List<String> answerList= new ArrayList<>();
        for(long i=0;i<list1.size();i++){
            if(list2.indexOf(list1.get((int)i)) != -1){
                answerList.add(list1.get((int)i));
                list2.remove(list2.indexOf(list1.get((int)i)));
            }
        }
        return answerList;
    }
}

answer = answerList
            .stream()
            .map(String::valueOf)
            .collect(Collectors.joining());

 

다른사람 풀이보고 한것

import java.util.*;
class Solution {
    public String solution(String X, String Y) {
        int[] arrX = new int[10];
        int[] arrY = new int[10];
        insert(arrX,X);
        insert(arrY,Y);
        String answer = getString(arrX,arrY);
        if (answer.equals("")) {
            return "-1";
        } else if (answer.startsWith("0")) {
            return "0";
        } 
        return answer;
    }
    public void insert(int[] arrX,String X){
        Arrays.stream(X.split(""))
                .map(Integer::parseInt)
                .forEach( x ->  arrX[x]++);
    }
    public String getString(int[] arrX,int[] arrY){
        StringBuilder answer = new StringBuilder();
        for(int i=9; i>=0;i--){
            while (arrX[i] >= 1 && arrY[i] >= 1) {
                arrX[i]--;
                arrY[i]--;
                answer.append(i);
            }
        }
        return answer.toString();
    }
}

 

 

스터디원 풀이

class Solution {
    public String solution(String x, String y) {
        StringBuffer answer = new StringBuffer("");
        char[] xArr = x.toCharArray();
        char[] yArr = y.toCharArray();
        Arrays.sort(xArr);
        Arrays.sort(yArr);
        int xIdx = 0;
        int yIdx = 0;
        while (xIdx < xArr.length && yIdx < yArr.length) {
            if (xArr[xIdx] == yArr[yIdx]) {
                answer.append(String.valueOf(xArr[xIdx]));
                xIdx++;
                yIdx++;
            } else if (xArr[xIdx] < yArr[yIdx]) {
                xIdx++;
            } else if (xArr[xIdx] > yArr[yIdx]) {
                yIdx++;
            }
        }
        if (answer.length() < 1)    return "-1";
        answer.reverse();
        String result = answer.toString();
        if (!result.contains("1") && !result.contains("2") && !result.contains("3") &&
           !result.contains("4") && !result.contains("5") && !result.contains("6") &&
           !result.contains("7") && !result.contains("8") && !result.contains("9")) {
            return "0";
        }
        return result;
        // return String.valueOf(Long.parseLong(result));
    }
}
class Solution {
    public String solution(String X, String Y) {
        Map<Character, Integer> xMap = new HashMap<>();
        Map<Character, Integer> yMap = new HashMap<>();
        
        for(char c : X.toCharArray()) {
            Character key = Character.valueOf(c);
            if(xMap.containsKey(key)) {
                xMap.replace(key, xMap.get(key) + 1);
            } else {
                xMap.put(key, 1);
            }
        }
        
        for(char c : Y.toCharArray()) {
            Character key = Character.valueOf(c);
            if(yMap.containsKey(key)) {
                yMap.replace(key, yMap.get(key) + 1);
            } else {
                yMap.put(key, 1);
            }
        }
        
        StringBuffer answer = new StringBuffer();
        List<Character> keyList = new ArrayList<>(xMap.keySet());
        keyList.sort((k1, k2) -> k2.compareTo(k1));
        
        for(Character k : keyList) {
            if(yMap.containsKey(k)) {
                int count = 0;
                if(xMap.get(k) >= yMap.get(k)) {
                    count = yMap.get(k);
                } else {
                    count = xMap.get(k);
                }

                for(int i = 0; i < count; i++) {
                    answer.append(k);
                }
            }
        }
        
        if(answer.length() == 0) {
            return "-1";
        } else {
            return answer.toString().replaceAll("0", "").length() == 0 ? "0" : answer.toString();
        }
    }
}