본문 바로가기

알고리즘

[프로그래머스] 정렬

728x90

가장 큰 수

- 정렬의 기초를 연습하기에 좋은 문제

    class Solution {
        public String solution(int[] numbers) {
            String[] strs = new String[numbers.length];
            for (int i = 0; i < numbers.length; i++) {
                strs[i] = String.valueOf(numbers[i]);
            }

            Arrays.sort(strs, (o1, o2) -> (o2 + o1).compareTo(o1 + o2));

            String answer = "";
            for (String s :
                    strs) {
                answer += s;
            }

            if (answer.charAt(0) == '0') return "0";

            return answer;
        }
    }
    
    
    // 스트림 활용
    public String solution(int[] numbers) {
        String answer = IntStream.of(numbers)
                .mapToObj(String::valueOf)
                .sorted((s1, s2) -> (s2 + s1).compareTo(s1 + s2))
                .collect(Collectors.joining());

        if (answer.startsWith("0")) return "0";
        return answer;
    }

 

마법의 엘리베이터

- 사실 정렬 문제라고 하기에는 애매함

- 1로 가는 케이스와, 10의 보수로 만들어서 + 1 한 다음 연산하는 케이스를 잘 구분해서 재귀로 처리

class Solution {
    public int solution(int storey) {
        return elevate(storey);
    }

    public int elevate(int storey) {
        if (storey <= 1) return storey;

        int remain = storey % 10;
        int share = storey / 10;

        int c1 = remain + elevate(share);
        int c2 = (10 - remain) + elevate(share + 1);

        return Math.min(c1, c2);
    }
}
300x250