[99클럽 코테 스터디 35일차 TIL] 프로그래머스 숫자 짝꿍

말하는 감자·2024년 12월 1일
0
post-thumbnail

99클럽 코테 스터디 35일차 TIL

💙 JAVA 비기너

📌 오늘의 학습 키워드

  • 문자열

📌 공부한 내용

📍 오늘의 문제

📍 작성 코드

class Solution {
    public String solution(String X, String Y) {
        StringBuilder answer = new StringBuilder();
        
        int[] xCntArr = new int[10];
        int[] yCntArr = new int[10];
        
        for(int i=0; i<X.length(); i++) {
            xCntArr[X.charAt(i) - '0'] += 1;
        }
        
        for(int i=0; i<Y.length(); i++) {
            yCntArr[Y.charAt(i) - '0'] += 1;
        }
        
        for(int i=9; i>=0; i--) {
            int N = Math.min(xCntArr[i], yCntArr[i]);
            for(int j=0; j<N; j++) {
                answer.append(i);
            }
        }
        
        if("".equals(answer.toString())) {
            return "-1";
        } else if('0' == (answer.toString().charAt(0))) {
            return "0";
        } else return answer.toString();

    }
}

📌 오늘의 회고

몇번이나 실패했는지...!!!!
처음에는 단순하게 이중for문을 통해 하나하나 비교하도록 만들었다.

📍 실패한 첫번째 코드

class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        
        String[] xArr = X.split("");
        String[] yArr = Y.split("");
        ArrayList<Integer> answerList = new ArrayList<>();
        
        for(int i=0; i<xArr.length; i++) {
            for(int j=0; j<yArr.length; j++) {
                if(xArr[i].equals(yArr[j])) {
                    answerList.add(Integer.parseInt(xArr[i]));
                    yArr[j] = "x";
                    break;
                }
            }
        }
        
        answerList.sort(Comparator.reverseOrder());
        
        if(answerList.isEmpty()) {
            answer = "-1";
        } else {
             boolean first = true;
            for(int num : answerList) {
                answer += num;
                if(first == true && num == 0) {
                    break;
                } else if(first == true) {
                    first = false;
                }
            }
        }
        
        return answer;
    }
}

하지만 시간초과로 실패...

그 뒤로 StringBuilder로 바꿔보기도 하고 다양한 방법을 시도해봤으나 계속 실패였다...

HashMap을 사용해서 같은 숫자 수를 저장할까? 고민하다가 배열로 하면 안되나? 싶어서 만들어본 두번째 코드

📍 실패한 두번째 코드

class Solution {
    public String solution(String X, String Y) {
        String answer = "";
        
        int[] xCntArr = new int[10];
        int[] yCntArr = new int[10];
        
        for(int i=0; i<X.length(); i++) {
            xCntArr[X.charAt(i) - '0'] += 1;
        }
        
        for(int i=0; i<Y.length(); i++) {
            yCntArr[Y.charAt(i) - '0'] += 1;
        }
        
        for(int i=9; i>=0; i--) {
            int N = Math.min(xCntArr[i], yCntArr[i]);
            for(int j=0; j<N; j++) {
                answer += i;
            }
        }
        
        if("".equals(answer)) {
            answer = "-1";
        } else if('0' == (answer.charAt(0))) {
            answer = "0";
        }
        
        return answer;
    }
}

첫번째보다 더 느려진 코드...
"감자의 생각은 어리석었을뿐인가...?ㅠㅠㅠ 다시 싹 지우고 HashMap으로 변경할까?" 하고 절망하다가
answer이 너무 여러번 바뀌면서 메모리와 시간을 많이 잡아먹는 게 아닐까? 싶어서 answer을 StringBuilder로 변경해보았다.

그 코드는 위에 올린 작성 코드!!

드디어 성고유ㅠㅠㅠㅠㅠ
심지어 속도가 첫번째보다 훠워어어어어얼씨이이인 빠르다...
StringBuilder가 진짜 빠르구나...

그렇다면 첫번째 코드도 StringBuilder로 전면교체 해본다면?!

📍 실패한 네번째 코드

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public String solution(String X, String Y) {
        StringBuilder answer = new StringBuilder();
        
        StringBuilder xSb = new StringBuilder(X);
        StringBuilder ySb = new StringBuilder(Y);
        ArrayList<Integer> answerList = new ArrayList<>();
        
        for(int i=0; i<xSb.length(); i++) {
            String xNum = xSb.substring(i,i+1);
            for(int j=0; j<ySb.length(); j++) {
                if(xNum.equals(ySb.substring(j,j+1))) {
                    answerList.add(Integer.parseInt(xNum));
                    ySb.deleteCharAt(j);
                    break;
                }
            }
        }
        
        answerList.sort(Comparator.reverseOrder());
        
        if(answerList.isEmpty()) {
            return "-1";
        } else {
             boolean first = true;
            for(int num : answerList) {
                answer.append(num);
                if(first == true && num == 0) {
                    break;
                } else if(first == true) {
                    first = false;
                }
            }
        }
        
        return answer.toString();
    }
}

응. 안돼. 돌아가.

profile
나는 말하는 감자다

0개의 댓글