-
코딩테스트 연습 - 가장 큰 수
0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰
programmers.co.kr
문제
해당 문제는 배열이 주어졌을 때 해당 배열의 값들을 이어 붙여 가장 큰 숫자를 만들어 출력하는 문제다.
조건
- numbers의 길이는 1 이상 100,000 이하입니다.
- numbers의 원소는 0 이상 1,000 이하입니다.
- 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.
풀이
해당 문제는 람다식을 이용해서 문제를 해결했고, 도저히 해답을 몰라 구글링을 통해 힌트를 얻었다.
먼저 처음 배열이 int형으로 주어지는데 이를 정렬하기 위해 String형으로 변환하기 위해서 Arrays.toString()과 StringTokenizer를 이용해서 변환을 하였고, 이후 정렬을 하는 과정에서 람다식을 이용하였다.
처음에는 배열을 한 자리마다 비교하는 방식으로 문제를 해결하려고 했으나 둘째 자리부터 헤매게 되었고 그래서 생각했던 게 위에서 String형 배열로 변환할 때 모든 값을 4자리로 만들어주고 진행하려고 하였고, 이후 방법으로는 전체를 먼저 정렬을 하고 첫 번째 자리만 정렬하는 방식으로 진행하였더니 테케에서 정렬이 되지 않는 걸 확인했다.
이후 구글링을 통해 해답을 얻었는데 정렬은 람다식으로 그대로 정렬하되 따로 문자열을 자르지 않고, 비교하는 두문자 열을 더해서 비교하는 방식으로 같은 자릿수로 만들어 비교하는 식으로 정렬을 하면 원하는 답을 얻을 수 있다는 것을 알게 되었다.
코드
import java.util.Arrays; import java.util.StringTokenizer; class Solution { public String solution(int[] numbers) { String[] num = new String[numbers.length]; String str = Arrays.toString(numbers).replaceAll("[^0-9 ]",""); // 먼저 배열에 있는 데이터를 1 2 3 4 형태로 변환 StringTokenizer st = new StringTokenizer(str); for (int i = 0; i < numbers.length; i++) { //위에서 변환한 데이터를 " "로 잘라서 배열에 저장 num[i] = st.nextToken(); } Arrays.sort(num, (a,b) -> (b+a).compareTo(a+b) ); // 람다식을 이용해서 정렬 if("0".equals(num[0])) // 입력데이터중 0만 들어간 데이터가 들어간 경우에 대해서는 000이 아닌 0만 리턴 return "0"; String answer = ""; for (String string : num) { answer+=string; } return answer; } }
GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드
JAVA 소스 코드. Contribute to JUNGSOONIL/JAVA development by creating an account on GitHub.
github.com
728x90'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 거리두기 확인하기 JAVA (0) 2022.03.09 프로그래머스 모의고사 JAVA (0) 2022.03.09 프로그래머스 K번째수 JAVA (0) 2022.03.08 프로그래머스 기능개발 JAVA (0) 2022.03.02 프로그래머스 로또의 최고 순위와 최저 순위 JAVA (0) 2022.02.13 댓글