본문 바로가기

👩🏻‍💻 코테

프로그래머스 Lv.2 : 가장 큰 수 🅾️

[문제]

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

 

프로그래머스

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

programmers.co.kr

 

[풀이]

import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        String[] str=new String[numbers.length];
        for(int i=0;i<numbers.length;i++) str[i]=String.valueOf(numbers[i]);
        
        Arrays.sort(str, new Comparator<String>(){
            @Override
            public int compare(String s1, String s2) {
                return Integer.parseInt(s2+s1) - Integer.parseInt(s1+s2);
            }
        });
        
        if(str[0].equals("0")) return "0";
        String rst="";
        for(String s:str) rst+=s;
        return rst;
    }
}

 

푸는데 30분 정도 소요된 문제.. 이유는 자꾸 런타임 에러가 발생해서 ..수정하고 수정하고,

마지막엔 뭐 그냥 거의 싹 갈아엎었다..^^!

 

⬇️ 첫 코드는 아래 코드이다. (아예 틀린 코드라 안 봐도 무방해서 접은 글로 작성했당ㅋㅋ)

더보기
import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        List<Integer> list=new ArrayList<>();
        for(int i:numbers) list.add(i);
        
        list.sort(new Comparator<Integer>(){
            @Override
            public int compare(Integer i1, Integer i2) {
                String s1=String.valueOf(i1);
                String s2=String.valueOf(i2);
                String[] str1=s1.split("");
                String[] str2=s2.split("");
                if(Integer.parseInt(str1[0])==Integer.parseInt(str2[0])) {
                    if(str1.length!=str2.length) return Integer.parseInt(str2[str2.length-1]) - Integer.parseInt(str1[str1.length-1]);
                    else return i2 - i1;
                } else return Integer.parseInt(str2[0]) - Integer.parseInt(str1[0]);
            }
        });
        
        String rst="";
        for(int i:list) rst+=i;
        return rst;
    }
}

 

결과는 100점 만 점 53.3점 .. 처참해 🥹

일단 시간 초과가 많이 발생했다.

이 접혀진 코드가 틀린 이유는 일단 시간을 많이 잡아 먹어서..

int를 String으로 계속 변환하고 변환하고 .. 그런 과정이 많을 뿐더러

코드 자체도 굉장히~ 복잡해보인다.

하여튼 코드를 가만 들여다보니 애초에 String으로 시작한다면? 이라는 생각을 하게 되었고,

그렇게 코드를 엎었다..!

그리고 작성한 두 번째 코드 👩🏻‍💻

import java.util.*;
class Solution {
    public String solution(int[] numbers) {
        String[] str=new String[numbers.length];
        for(int i=0;i<numbers.length;i++) str[i]=String.valueOf(numbers[i]);
        Arrays.sort(str, new Comparator<String>(){
            @Override
            public int compare(String s1, String s2) {
                return Integer.parseInt(s2+s1) - Integer.parseInt(s1+s2);
            }
        });
        String rst="";
        for(String s:str) rst+=s;
        return rst;
    }
}

 

분명 맞는 것 같았는데 1개의 테스트케이스를 틀렸다.

그래서 예외 처리가 뭐가 있나 반례를 떠올려봤는데,

모든 수가 0인 경우 0를 리턴해주어야 하는데 대략 "0000.." 이런 수를 리턴하게 된다는 중요한 사실을 깨달았다.

그리고 맨 위의 최종 코드로 마지막 제출을 했고 결과는 성공 >_<!

 

내가 비효율적인 코드를 작성한건지.. 아님 원래 오래 걸리는지..

왠지 정렬 문제라 오래 걸릴 것 같다는 예상은 했으나 어떤 케이스는 3000ms 라니..

프로그래머스 코테를 풀면서 본 적 없는 숫자다..! 👀

 

+++

내가 정렬 코테에 약한 것 같다는 생각이 들었다..

앞으로 정렬 코테 연습을 많이 해야겠다는 다짐을 하였돠...ㅎㅎ