Study(진행중)/항해99
99클럽 코테 스터디 11일차 TIL + 가장 큰 수(프로그래머스)
Ski_
2024. 8. 2. 01:11
오늘의 학습 키워드
- 알고리즘
- 정렬
공부한 내용 본인의 언어로 정리하기
https://school.programmers.co.kr/learn/courses/30/lessons/42746
문제를 간략히 설명하자면, 배열로 주어진 0부터 1000 사이의 숫자들을 활용해 가장 큰 수를 만드는 문제였다.
그래서 정렬을 어떤 방식으로 할 지 열심히 고민해야 하는 문제였다.
개인적으로 풀이가 최적의 시간으로 풀었다고는 생각하지는 않았고, 다른 사람들의 풀이도 찾아봤지만
나름 스스로 아이디어를 가지고 풀었기에 작성했다.
풀이 과정은 다음과 같다.
1. 두 숫자의 각 자리수마다 비교해서 다르다면 큰 숫자를 return한다.
2. 이 과정을 각 자리수의 곱만큼 반복한다(만약 123과 1234같은 형식이라면 최대 12번 반복한다)
2 - 1. 반복하는 도중 숫자의 자리수가 넘어간다면 원래 숫자의 자리수로 나머지 연산자를 적용하고 비교한다.
(만약 123과 1234를 비교할 때 4번째 자리수를 비교하는 경우 123/1 -> 1과 1234 -> 4를 비교한다)
3. 그래도 전부 동일하다면 이는 우선순위가 동일한 숫자이다.
풀이는 다음과 같다.
import java.util.*;
class Solution {
public String solution(int[] numbers) {
int length = numbers.length;
String[] numberStr = new String[length];
for (int i = 0; i < length; i++) {
numberStr[i] = String.valueOf(numbers[i]);
}
Arrays.sort(numberStr, (o1, o2) -> {
char[] str1 = o1.toCharArray();
int length1 = str1.length;
char[] str2 = o2.toCharArray();
int length2 = str2.length;
int gcd = length1 * length2;
int i = 0;
while (i < gcd) {
char c1, c2;
c2 = length2 <= i ? str2[i % length2] : str2[i];
c1 = length1 <= i ? str1[i % length1] : str1[i];
if (c1 != c2) return c2 - c1;
i++;
}
return 0;
});
StringBuilder sb = new StringBuilder();
if (numberStr[0].equals("0")) return "0";
for (String number : numberStr) {
sb.append(number);
}
return sb.toString();
}
}
내일 학습할 것은 무엇인지
내일은 코드트리 삼성 기출문제를 풀 예정이다.
반응형