본문으로 바로가기

프로그래머스 - 가장 큰 수

category 코딩테스트 2020. 9. 13. 21:54

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