프로그래머스 코딩테스트 연습 가장 큰 수 (정렬)
오늘은 프로그래머스의 가장 큰 수 문제를 풀어 보았다. 처음 생각했을 때 문자열로 바꾸어 모든 경우의 수를 구하여 배열에 담는 생각을 하였는데, 그럴 경우
코드가 너무 복잡하였고, 문제 의도와 완전히 다른 것 같아 포기하였다. 이후, 제일 큰수가 만들어 질 때 큰 수 대로 나열하여 만드는 로직을 생각하였지만,
정렬과는 거리가 멀었다.(예: [6, 70, 7,47]이 들어왔다면, 처음 제일 큰 건 7이고 이후 70이 나오는게 제일 크다, 그리고 6이 나오고 47이 나오는 각 자리의
앞자리가 큰 거부터 나열하고 수가 같은 것이 있다면, 1자리수가 있는지 확인 있다면 두자리 수가 1자리 수보다 크다면 ex. 5와 50~55는 5가먼저, 56~59는
두자리수가 우선순위)
아무튼 복잡하다… 빠르게 포기하고 답을 보았는데, comparator클래스의 compare를 오버라이딩하여 문제를 푸는 것이 빠른 것을 확인, 다만 compare오버라이딩이
익숙치 않아 이해하는데 시간이 좀 걸렸다.
문제 풀어보기
완성된 코드이고, 코드는 유튜브CodingTest_User님의 유튜브를 참고하여 작성하였다. 유튜브안에서 compare 오버라이딩도 알려주셔서 알 수 있었고, o1과 o2의 더함(문자열이기 때문에 문자열로 붙게되어 두수를 합친 경우의 수가되는 것으로 이해 됨) 을 비교하여 자리를 바꿔주는 것이다.(리턴 1이면 자리 변경 0이면 같은수 -1이면 그대로)
해당 문제로 알게된 것
valueOf
여기서 쓰인 valueOf는 인트형을 스트링형으로 변환하여 저장한다는 의미를 가지고 있었다.
Compare 클래스의 compare오버라이딩
정렬할 때 compare을 오버라이딩하여 나의 입맛에 맞게 변화시켜줄 수 있었고, 람다식으로 표현한다면,
Arrays.sort(arr, (o1,o2) -> (o2+o1).compareTo(o1+o2));
이런식으로 표현 가능하다.