내 블로그에 처음으로 댓글이 달렸던 그 문제!
이번엔 자바로 풀어보자.
문제
https://programmers.co.kr/learn/courses/30/lessons/42746
풀이
1차 풀이
Hastable을 이용한 접근을 시도했다.
- Key에는 4자리수 이상으로 키워낸 문자열 대입.
- Value에는 원본 정수모양 문자열 대입.
- Key 기준 내림차순 정렬.
- 정렬된 순서대로 Value를 합쳐서 반환!
import java.util.*;
class Solution {
public String solution(int[] numbers) {
// Hastable 선언.
Hashtable<String, String> NumTable = new Hashtable<String, String>();
// 입력 받은 정수 개수만큼 루프.
for(int i = 0; i < numbers.length; i++){
// Key, Val 초기화.
String NumKey = Integer.toString(numbers[i]);
String NumVal = Integer.toString(numbers[i]);
// Key값 최소 4자리로 증폭시키기.
while(NumKey.length() < 4) NumKey += NumKey;
// Hastable에 삽입.
NumTable.put(NumKey, NumVal);
}
// Key값만 뽑아서 ArrayList 생성 후 오름차순 정렬.
List<String> NumKeys = new ArrayList(NumTable.keySet());
Collections.sort(NumKeys, Collections.reverseOrder());
// Key값 기준 Val 뽑아서 최종 반환값 작성.
String answer = "";
for(String key : NumKeys) answer += NumTable.get(key);
return answer;
}
}
그러나 Hastable은 Key값 중복을 허용하지 않는다는 점을 간과했다.
테스트케이스를 싹 다 틀렸다!
2차 풀이
Hastable의 Key값 중복이 허용되지 않으니 어떻게 해결해야하나 조사하다가,
자바도 파이썬처럼 Lambda식을 지원한다고 하길레 속으로 환호를 외치면서
Collections.sort 함수에 Lambda식을 적용했다.
import java.util.*;
class Solution {
public String solution(int[] numbers) {
// 문자열 ArrayList 선언.
List<String> StringNumbers = new ArrayList<>();
// 입력 받은 정수를 ArrayList에 문자열 형태로 삽입.
for(int i = 0; i < numbers.length; i++)
StringNumbers.add(Integer.toString(numbers[i]));
// Lambda식 정렬 (내림차순)
Collections.sort(StringNumbers, (a, b)->{
a += a + a;
b += b + b;
return b.compareTo(a);
});
// 최종 반환값 작성.
String answer = "";
for(String sn : StringNumbers) answer += sn;
return answer;
}
}
잘 돌아간다! 싶었는데 마지막 테스트케이스에 걸린다.
생각해보니 파이썬으로 구현할 때도 결과 값 앞에 0이 달라붙는 케이스가 있었다.
그새 그걸 까먹냐!
정답 풀이
import java.util.*;
class Solution {
public String solution(int[] numbers) {
// 문자열 ArrayList 선언.
List<String> StringNumbers = new ArrayList<>();
// 입력 받은 정수를 ArrayList에 문자열 형태로 삽입.
for(int i = 0; i < numbers.length; i++)
StringNumbers.add(Integer.toString(numbers[i]));
// Lambda식 정렬 (내림차순)
Collections.sort(StringNumbers, (a, b)->{
a += a + a;
b += b + b;
return b.compareTo(a);
});
// 최종 반환값 작성.
String answer = "";
for(String sn : StringNumbers) answer += sn;
// 0 예외처리.
if(answer.charAt(0) == '0') return "0";
else return answer;
}
}
작년 이맘쯤 Lambda 개념을 처음 접했을 땐 참 무서웠는데(?),
이젠 내가 먼저 쓰고 싶어서 안달인걸 보니 신기하기도 하고…
어쨌거나, 재밌다!
댓글남기기