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긴 한데, 독서를 참 좋아하는데도 어릴 때 독서 감상문의 느낀 점은 되게 이질적이였다..
뭔가 책을 읽고 하나의 필수 양식같은 무조건 느껴야 하나 ? 라는 생각이 들어서일까
그런데 요샌 어떤 걸 하더라도, 읽더라도 느낀 점이 생긴다 내 관점에서의 생각과 다른 관점의 생각들로 자유롭게
떠오르더라.. 그리고 풀다보면 궁금한 것들과 깊게 파고 드는 것 자체가 느낀 점인 것 같다.
여튼 그냥 쓰는 함수들을 좀 더 깊게 탐구할 수 있어서 좋았고, 그렇다고 더 깊게 파고 들고 싶지만 너무 깊어서..
허투루 넘어가진 말자 !
그리고 정렬 기준이 좀 어려웠다.. 앞 자리수로만 생각하고 같다면 다음 자리 수로 비교할 생각에 더 탐색 해야할 것 같았지만
그냥 합쳐서 비교하면 되는 걸.. 쉬운 방법을 더 생각해보자
'알고리즘' 카테고리의 다른 글
FloodFill 알고리즘 (0) | 2024.05.28 |
---|---|
99클럽 코테 스터디 8일차 TIL H-Index (0) | 2024.05.27 |
99클럽 코테 스터디 5일차 TIL 더 맵게 (0) | 2024.05.24 |
99클럽 코테 스터디 4일차 TIL 올바른 괄호 feat(queue.add vs offer) (0) | 2024.05.23 |
99클럽 코테 스터디 3일차 TIL 기능개발 (0) | 2024.05.22 |