99클럽 코테 스터디 35일차 TIL - 숫자 짝꿍

수삼·2024년 12월 1일
0

코딩테스트

목록 보기
39/44

숫자 짝꿍

1번째 시도

처음에 풀었던 방식인데
시간초과로 실패했다.

        PriorityQueue<Integer> pqX = new PriorityQueue<>(Collections.reverseOrder());
        PriorityQueue<Integer> pqY = new PriorityQueue<>(Collections.reverseOrder());

        for (int i = 0; i < X.length(); i++) {
            pqX.add(parseInt(String.valueOf(X.charAt(i))));
        }
        for (int i = 0; i < Y.length(); i++) {
            pqY.add(parseInt(String.valueOf(Y.charAt(i))));
        }
        StringBuilder sb = new StringBuilder();

        while (!pqX.isEmpty() && !pqY.isEmpty()) {
            Integer peekX = pqX.peek();
            Integer peekY = pqY.peek();
            if (peekX > peekY) {
                pqX.poll();
            } else if (peekX < peekY) {
                pqY.poll();
            } else {
                sb.append(peekX);
                pqX.poll();
                pqY.poll();
            }
        }
        if (sb.length() == 0){
            sb.append("-1");
        }

        System.out.println(Integer.parseInt(sb.toString())+"");

2번째 시도

0만 있는 경우를 대비해 int로 변환했다가 다시 스트링으로 반환해줬다.
시간초과로 실패했다.

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

        for (char c : X.toCharArray()) {
            countX[c - '0']++;
        }

        for (char c : Y.toCharArray()) {
            countY[c - '0']++;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 9; i >= 0; i--) {
            int cnt = Math.min(countX[i], countY[i]);
            for (int j = 0; j < cnt; j++) {
                sb.append(i);
            }
        }

        if (sb.length() == 0) {
            sb.append("-1");
        }
        
        return Integer.parseInt(sb.toString())+"";
    }
}

3번째 시도(성공)

return Integer.parseInt(sb.toString())+""; -> return sb.toString()
숫자 변환을 거치지 않고 String으로 return함
첫번째 숫자가 0인경우는 0으로 바꿔서 반환해줬다.

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

        for (char c : X.toCharArray()) {
            countX[c - '0']++;
        }

        for (char c : Y.toCharArray()) {
            countY[c - '0']++;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 9; i >= 0; i--) {
            int cnt = Math.min(countX[i], countY[i]);
            for (int j = 0; j < cnt; j++) {
                sb.append(i);
            }
        }

        if (sb.length() == 0) {
            sb.append("-1");
        } else if (sb.charAt(0) == '0') {
            sb.setLength(0);
            sb.append("0");
        }
        
        return sb.toString();
    }
}

추가로..

처음 풀었던 코드에서도 리턴문만 바꿔주니까 성공했다.
String을 int로 변경하는데 오래걸리는것같다.
전체적으로 위 코드보단 실행시간이 느리다.


class Solution {
    public String solution(String X, String Y) {
PriorityQueue<Integer> pqX = new PriorityQueue<>(Collections.reverseOrder());
        PriorityQueue<Integer> pqY = new PriorityQueue<>(Collections.reverseOrder());

        for (int i = 0; i < X.length(); i++) {
            pqX.add(parseInt(String.valueOf(X.charAt(i))));
        }
        for (int i = 0; i < Y.length(); i++) {
            pqY.add(parseInt(String.valueOf(Y.charAt(i))));
        }

        StringBuilder sb = new StringBuilder();

        while (!pqX.isEmpty() && !pqY.isEmpty()) {
            Integer peekX = pqX.peek();
            Integer peekY = pqY.peek();
            if (peekX > peekY) {
                pqX.poll();
            } else if (peekX < peekY) {
                pqY.poll();
            } else {
                sb.append(peekX);
                pqX.poll();
                pqY.poll();
            }
        }
        if (sb.length() == 0) {
            sb.append("-1");
        } else if (sb.charAt(0) == '0') {
            sb.setLength(0);
            sb.append("0");
        }
        
        return sb.toString();
    }
}

0개의 댓글