K번째 수
문제의 조건을 살펴보면,
고려해야할 사항
문제풀이 1 - 복사하는 배열을 활용하여 배열을 잘라본다.
public class NumberOfKth {
public int[] solution(int[] array, int[][] commands) {
// 1번
int[] answer = new int[commands.length];
int idx = 0;
// 2번
for (int[] command : commands) {
int[] arr = Arrays.copyOfRange(array, command[0] - 1, command[1]);
Arrays.sort(arr);
// 3번
answer[idx++] = arr[command[2] - 1];
}
return answer;
}
}
Java
복사
1.
우리에게 요청이 온 답을 담은 공간인 answer의 개수는 commands의 길이만큼이다.
2.
이차원배열 commands를 for문으로 꺼내어 일차원배열 arr을 만들고, 요구한 범위만큼 자르고 오름차순으로 정렬한다.
a.
시작점은 command[0]-1 —> 컴퓨터는 0부터 시작하고 시작부터이기 때문
b.
마지막점은 commands[1] —> 미만이기 때문
3.
요청이 온 순서대로 자른 배열의 k번째 수를 answer 배열에 담는다.
시간복잡도를 생각해보자.
문제풀이 2 - 우선순위 큐 활용
public int numberOfKth(int[] array, int[] command) {
// 1번
int start = command[0]-1;
int last = command[1];
int kth = command[2];
int rst = 0;
// 2번
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int i = start; i < last; i++) {
pq.add(array[i]);
}
for (int i = 0; i < kth; i++) {
rst = pq.poll();
}
return rst;
}
public int[] solutionV2(int[] array, int[][] commands) {
int[] answer = new int[commands.length];
// 3번
for (int i = 0; i < commands.length; i++) {
answer[i] = numberOfKth(array, commands[i]);
}
return answer;
}
Java
복사
1.
시작점, 마지막점, k번째수, 결과값을 사용하기 위해 변수 선언 후 초기화 한다.
2.
우선순위 큐를 만들고 시작점부터 마지막점미만 까지의 숫자를 넣는다.(단, 값이 들어갈 때 낮은 숫자가 우선순위로 들어간다.)
3.
numberOfKth() 메서드를 통해 나온 값을 순서대로 answer값에 넣는다.
Priority Queue?
Priority Queue 메서드
// 첫번째 값을 반환하고 제거 비어있다면 null
priorityQueueLowest.poll();
// 첫번째 값 제거 비어있다면 예외 발생
priorityQueueLowest.remove();
// 첫번째 값을 반환만 하고 제거 하지는 않는다.
// 큐가 비어있다면 null을 반환
priorityQueueLowest.peek();
// 첫번째 값을 반환만 하고 제거 하지는 않는다.
// 큐가 비어있다면 예외 발생
priorityQueueLowest.element();
// 초기화
priorityQueueLowest.clear();
Java
복사
시간복잡도를 생각해보자.
가장 큰 수
제한 사항
풀이 1 (Comparator)
package com.likelion.programmers;
import java.util.Arrays;
import java.util.Comparator;
public class Solution{
public String solution(int[] numbers) {
String[] arr = new String[numbers.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = String.valueOf(numbers[i]);
}
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return ((o2+o1).compareTo(o1+o2));
}
});
if(arr[0].equals("0")) {
return "0";
}
String answer = "";
for(String str:arr) {
answer += str;
}
return answer;
}
}
Java
복사
풀이 2 (람다식을 이용한 Comparator)
import java.util.Arrays;
public class Solution {
public String solution(int[] numbers) {
String answer = "";
String[] stringList = new String[numbers.length];
for (int i = 0; i < numbers.length; i++) {
stringList[i] = String.valueOf(numbers[i]);
}
Arrays.sort(stringList, (first, next) -> {
return (first + next).compareTo(next + first);
});
for (int i = numbers.length-1; i >= 0; i--) {
answer += stringList[i];
}
if (answer.charAt(0) == '0') {
answer = "0";
}
return answer;
}
}
Java
복사