www.welcomekakao.com/learn/courses/30/lessons/42746?language=java
코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 ��
www.welcomekakao.com
<내가 작성한 코드>
public String solution(int[] numbers) {
StringBuffer answer = new StringBuffer();
List<String> numberList = new ArrayList<>();
for (int number : numbers) {
numberList.add(""+number);
}
Collections.sort(numberList, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
int s1Length = s1.length();
int s2Length = s2.length();
if (s1Length > s2Length) {
Character ch1 = s1.charAt(s1Length-1);
Character ch2 = s2.charAt(0);
return ch2.compareTo(ch1);
} else if (s1Length < s2Length) {
Character ch1 = s1.charAt(0);
Character ch2 = s2.charAt(s2Length-1);
return ch2.compareTo(ch1);
}
return s2.compareTo(s1);
}
});
for (String number : numberList) {
answer.append(number);
}
return answer.toString();
}
결과 : 시간 초과
<모범 답안>
풀이 방식
- 숫자 -> 문자 -> 내림차순 정렬 -> 조합
- 현재 문자열과 다음 문자열의 append 방식을 서로 비교해서, 문자열 내림차순 정렬을 한다.
public String solution(int[] numbers) {
String[] strNums = new String[numbers.length];
for (int i=0; i<numbers.length; i++) {
strNums[i] = "" + numbers[i];
}
/*
* 아래 for문은 수행속도가 느려 시간초과가 발생한다.
*/
// for (int i=0; i<strNums.length-1; i++) {
// for (int j=i+1; j<strNums.length; j++) {
// String s1 = strNums[i];
// String s2 = strNums[j];
// if ((s1+s2).compareTo(s2+s1) < 0) {
// strNums[i] = strNums[j];
// strNums[j] = s1;
// }
// }
// }
/*
* Arrays.sort 메소드를 이용해 시간초과 문제 해결.
*/
Arrays.sort(strNums, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s2+s1).compareTo(s1+s2);
}
});
String answer = "";
for (String s : strNums) {
answer += s;
}
if (answer.charAt(0) == '0') {
return "0";
}
return answer;
}
<Java8 방식으로 리팩토링한 숏코딩>
public String solution(int[] numbers) {
String answer = IntStream.of(numbers)
.mapToObj(String::valueOf)
.sorted((s1, s2) -> (s2+s1).compareTo(s1+s2))
.collect(Collectors.joining());
/*
* charAt 보다는 startsWith가 좀 더 권장되는 방법
*/
if (answer.startsWith("0")) {
return "0";
}
return answer;
}
결과 : 정확성, 효율성 PASS
'코딩테스트' 카테고리의 다른 글
leetcode - Count Negative Numbers in a Sorted Matrix (0) | 2020.10.05 |
---|---|
leetcode - Shortest Unsorted Continuous Subarray (0) | 2020.09.28 |
프로그래머스 - 기지국 설치 (0) | 2020.09.07 |
해커랭크(SQL) - New Companies (0) | 2020.09.07 |
입력받은 숫자를 우리가 읽는소리로 출력하는 코드를 작성하시오. (0) | 2019.01.07 |