내 블로그에 처음으로 댓글이 달렸던 그 문제!
이번엔 자바로 풀어보자.

문제

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 개념을 처음 접했을 땐 참 무서웠는데(?),
이젠 내가 먼저 쓰고 싶어서 안달인걸 보니 신기하기도 하고…
어쨌거나, 재밌다!

댓글남기기