728x90
https://school.programmers.co.kr/learn/courses/30/lessons/42748
정렬 알고리즘 1단계 문제입니다.
java.util.Arrays 클래스에 있는 메서드를 사용하지 않았다면 1단계지만 상당히 애먹었을 것 같습니다.
우선 코드는 아래와 같습니다.
import java.util.*;
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = {};
answer = new int[commands.length];
int index = 0;
for(int[] ijk : commands){
int[] arr = Arrays.copyOfRange(array,ijk[0]-1,ijk[1]);
Arrays.sort(arr);
answer[index] = arr[ijk[2]-1];
index += 1;
}
return answer;
}
}
문제 풀이의 키는 commands의 이차원 배열을 분리해 i, j, k 각각의 값을 추출하는 것이라 판단했습니다.
그래서 향상된 for문을 사용해 ijk라는 일차원 배열로 값을 받고 배열의 인덱스를 사용해 해결했습니다.
배열이 있으면 자연스럽게 향상된 for문을 사용하게 되는데 이번 문제의 경우 일반 for문을 사용했으면
index 변수를 새로 생성하지 않아도 됩니다.
아래의 코드는 같이 공부하는 스터디원의 풀이입니다.
Arrays 클래스의 copyOfRange() 메서드를 사용하지 않고 풀려고 했습니다.
그랬더니 sort() 메서드를 사용할 경우 배열의 실제 데이터까지 변경되어 올바른 답이 나오지 않았습니다.
그다음에는 새로운 int[] 배열을 만들어 매번 매개변수 array값으로 선언해주면 되지 않을까?라고 생각했지만
이때 새로운 int[] 배열이 array의 메모리 주소 값을 참조하는 것이기 때문에 새로운 int[] 배열을 정렬할 경우 실제 array의
데이터 값도 정렬되어 올바른 답이 나오지 않았습니다.
때문에 얕은복사가 아닌 깊은 복사가 필요했고, clone()이라는 메서드를 생성해서 데이터 값을 담아 문제를 해결했습니다.
import java.util.*;
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = new int[commands.length];
for(int a = 0; a < commands.length; a++){
int i = commands[a][0];
int j = commands[a][1];
int k = commands[a][2];
int[] arr = array.clone(); // clone을 사용하지 않는다면?
Arrays.sort(arr,i-1,j);
answer[a] = arr[i+k-2];
}
return answer;
}
}
728x90
'Algorithm > Java 풀이' 카테고리의 다른 글
프로그래머스 프린터 자바 풀이 (0) | 2022.09.23 |
---|---|
프로그래머스 같은 숫자는 싫어 자바풀이 (1) | 2022.09.23 |
백준 1008 자바 (0) | 2022.03.11 |
백준 10998 자바 (0) | 2022.03.11 |
백준 1001 자바 (0) | 2022.03.11 |