[문제]
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 라니..
프로그래머스 코테를 풀면서 본 적 없는 숫자다..! 👀
+++
내가 정렬 코테에 약한 것 같다는 생각이 들었다..
앞으로 정렬 코테 연습을 많이 해야겠다는 다짐을 하였돠...ㅎㅎ
'👩🏻💻 코테' 카테고리의 다른 글
| 프로그래머스 Lv.1 : 최소직사각형 🅾️ (0) | 2024.03.22 |
|---|---|
| 백준 S1 2178 : 미로 탐색 🅾️ (0) | 2024.03.22 |
| 프로그래머스 Lv.2 : 게임 맵 최단거리 🅾️ (0) | 2024.03.22 |
| 프로그래머스 Lv.1 : 비밀지도 🅾️ (0) | 2024.03.21 |
| 프로그래머스 Lv.1 : 로또의 최고 순위와 최저 순위 🅾️ (0) | 2024.03.20 |