알고리즘

99클럽 코테 스터디 7일차 TIL 가장 큰 수

ernest45 2024. 5. 26. 22:49

https://school.programmers.co.kr/learn/courses/30/lessons/42746

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1. 문제 및 접근법

 

가장 큰 수

0 or 양의 정수가 주어질 떄 이 정수를 이어 붙여 가장 큰 수를 만들 수 있는 수를 문자열로 리턴

100,000개니까 완탐 x

우선 순위를 부여하자 ex) 6, 9 ,10 ,3 이라면 앞자리가 제일 중요 그 다음 앞자리가 같다면 뒷자리를 비교해 우선순위 부여

(만약 자리 수가 다르다면 더 적은 자리수가 더 앞에 와야 크다.)

 

compare도 구현해보고, merge sort 직접 구현해보기

 

 

 

2.compare

 

private String solution(int[] numbers) {

    String[] strNumbers = Arrays.stream(numbers) // 정수들을 스트림으로 문자열로 변환하는 과정
            .mapToObj(String::valueOf)
            .toArray(String[]::new);


    // 정렬 comparator 인터페이스 구현을 자리수로 비교해서 구현
        Arrays.sort(strNumbers, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            String order1 = o1 + o2;
            String order2 = o2 + o1;
            return order2.compareTo(order1); // Descending order
        }
    });

      // 0이 들어올 수 있으니 정렬 후에 0이면 0 return;
        if (strNumbers[0].equals("0")) {
        return "0";
    }

    // 좀 더 빠르게 StringBuilder에 담아 반환
    StringBuilder result = new StringBuilder();
        for (String number : strNumbers) {
        result.append(number);
    }

        return result.toString();
}

 

전체 풀이

 

 

2-1 int 배열을 stream을 활용해 String 배열로 변환

 

 

원래는 for문이나 iter를 많이 썼는데, 가동성과 재사용성이 떨어져 ( 데이터의 소스마다 바꿔야함 ex) collection.sort() , arrays.sort() 등) stream 을 사용해봤다.

 

처음에 stream이라는 개념이 너무 안 와닿아 찾아보니 그냥 통로라고 생각하면 더 편하다. 통로 안에 데이터를 담는 느낌

stream이란 ? ->

 

 

- 스트림은 데이터 소스를 변경하지 않는다.

- 스트림은 일회용이다

- 스트림은 작업을 내부 반복으로 처리한다.

 

 

2-2 compare

 

우린 primitive 타입의 변수들은 부등호로 쉽게 비교했지만 객체 비교를 위해선 두가지 인터페이스를 사용할 수 있다.

 

 

정렬을 위해 직접 구현 가능한 인터페이스는 Comparable(compareTo()) 와 Comparator(compare())가 있는데

간단하게 정리하자면

 

comparable의 인터페이스는 compareTo() 메서드를 @Overrride 해야하며, 객체와 자기 자신을 비교한다면

 

comparator의 compare은 들어온 매개변수 둘을 비교한다.

 

 

비교 방법은 간단하다.

 

매개 변수로 들어온 두개 중 -1, 0, 1 셋 중 하나를 return한다.

order1은 12고, order2가 25라면 합쳐 1225와 2512를 비교한다.

 

자바 정렬 기본이 오름차순이기에 반대로 내림차순으로 정렬 하려면 order2 - order1로 간단하게 구현해주면 되지만

 

 

주의점은 -의 경우 잘못하다 자료형의 데이터 범위를 넘어서게 되어 OverFlow가 발생할 수 있기에

여기서 String 메서드 compareTo를 사용한다.

 

 

 

 

정리하자면

 

return 값에서 오름차순이라면 order1 - order2가 음수라면 (order1이 order2보다 작다는 뜻이니) 자리를 바꾸지 않는다.

반대의 경우인 내림차순은 order2를 기준으로 잡아주면 된다.

 

 

 

 

2-3 예외처리 및 반환

 

 

마지막으로 정렬 후 0이 앞자리에 있다면 수가 완성될 수 없기에 예외처리 후

 

 

StringBuilder가 일반 sout보다 효율적이라 하나씩 담아 return 해주면 완성이다.

 

 

 

 

 

 

compare이나 comparable에 대해 궁금하다면 밑 설명의 링크를 타고가자 !

(이 분 진짜 장난아니심..)

https://st-lab.tistory.com/243

 

자바 [JAVA] - Comparable 과 Comparator의 이해

아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객

st-lab.tistory.com

 

 

 

3. mergesort

merge sort 자체는 구현했지만 비교 과정에서 헷갈려 

 

 

 

4. 느낀 점

 

TMI긴 한데, 독서를 참 좋아하는데도 어릴 때 독서 감상문의 느낀 점은 되게 이질적이였다..

뭔가 책을 읽고 하나의 필수 양식같은 무조건 느껴야 하나 ? 라는 생각이 들어서일까

그런데 요샌 어떤 걸 하더라도, 읽더라도 느낀 점이 생긴다 내 관점에서의 생각과 다른 관점의 생각들로 자유롭게

떠오르더라.. 그리고 풀다보면 궁금한 것들과 깊게 파고 드는 것 자체가 느낀 점인 것 같다.

 

 

 

여튼 그냥 쓰는 함수들을 좀 더 깊게 탐구할 수 있어서 좋았고, 그렇다고 더 깊게 파고 들고 싶지만 너무 깊어서..

허투루 넘어가진 말자 !

 

 

그리고 정렬 기준이 좀 어려웠다.. 앞 자리수로만 생각하고 같다면 다음 자리 수로 비교할 생각에 더 탐색 해야할 것 같았지만

그냥 합쳐서 비교하면 되는 걸.. 쉬운 방법을 더 생각해보자