https://programmers.co.kr/learn/courses/30/lessons/42748
내가 푼 방법
그냥 문제를 정리하고 풀라는대로 풀었다. for문으로 2차원 배열인 commands의 0~n번째 행을 읽고...했다.
코드
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = new int[commands.length]; // 초기화 해줘야 index 에러가 안뜬다
for(int i = 0; i < commands.length; i++){ // 행
ArrayList<Integer> cal = new ArrayList<>(); // 돌 때마다 초기화
for(int j = commands[i][0] - 1; j < commands[i][1]; j++){
cal.add(array[j]); // array에서 읽어서 cal에 더한다
}
Collections.sort(cal); // 오름차순 정렬
answer[i] = cal.get(commands[i][2] - 1);
}
return answer;
}
}
맨 처음에 answer를 초기화 안해줘서 에러났음...
다른 사람의 풀이
Arrays.copyOfRange를 사용했다. copyOfRange()는 배열을 복사하는 메소드이다.
Arrays.copyOfRange(원본 배열, 복사할 시작 인덱스, 끝 인덱스) // 이렇게 사용한다.
temp 배열을 만들어서 잘라야하는 부분만큼 잘라서 복사했다. ㄷㄷㄷ
class Solution {
public int[] solution(int[] array, int[][] commands) {
int n = 0;
int[] ret = new int[commands.length];
while(n < commands.length){
int m = commands[n][1] - commands[n][0] + 1;
if(m == 1){
ret[n] = array[commands[n++][0]-1];
continue;
}
int[] a = new int[m];
int j = 0;
for(int i = commands[n][0]-1; i < commands[n][1]; i++)
a[j++] = array[i];
sort(a, 0, m-1);
ret[n] = a[commands[n++][2]-1];
}
return ret;
}
void sort(int[] a, int left, int right){
int pl = left;
int pr = right;
int x = a[(pl+pr)/2];
do{
while(a[pl] < x) pl++;
while(a[pr] > x) pr--;
if(pl <= pr){
int temp = a[pl];
a[pl] = a[pr];
a[pr] = temp;
pl++;
pr--;
}
}while(pl <= pr);
if(left < pr) sort(a, left, pr);
if(right > pl) sort(a, pl, right);
}
}
음.... commands 값이 2 5 3 이면 5-3+1 개만큼 읽어오는 방법을 사용했다. 얘가 m이고
a라는 크기가 m인 배열을 만들어 그 안에 array에서 읽어온 값을 넣는다
sort라는 함수를 만들어 오름차순 정렬을 직접 구현했다.
정렬은 퀵 정렬을 사용하심... 정렬도 직접 구현해봐야 코딩이 느나보다!
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 실패율 for JAVA (0) | 2021.12.16 |
---|---|
[프로그래머스] 폰켓몬 for JAVA (0) | 2021.12.13 |
[프로그래머스] 소수 만들기 for JAVA (0) | 2021.11.26 |
[프로그래머스] 내적 for JAVA (0) | 2021.11.25 |
[프로그래머스] 음양 더하기 for JAVA (0) | 2021.11.25 |