입력 명령어은 2차원 배열 commands로 주어진다. commands의 하나의 행이 한 명령어이다. 따라서 commands의 행 개수 만큼 반복문을 돌면서 수행한다. 2차원 배열의 행 개수는 해당 배열의 length이다. 예를 들어 commands의 행 개수는 commands.length이다.
Arrays.copyOfRange(원본 배열, 시작 인덱스, 끝 인덱스 + 1)을 이용하여 배열을 잘랐다. 이 메소드의 인자로 입력으로 들어온 commands의 원소를 주는데, 주의해야 할 점은 입력은 1부터 시작하는 인덱스이고, 배열은 0부터 시작하는 인덱스라는 점이다. 따라서 입력으로 들어온 인덱스에 모두 -1을 해줘야만 정확한 결과를 얻을 수 있고, 배열의 범위를 넘어갔다는 에러가 뜨지 않는다.
int[] subArray = Arrays.copyOfRange(array, commands[i][0]-1, commands[i][1]);
이 메소드 말고,
for문으로도 풀어보고ArrayList로 만들어서도 풀어봤는데 계속 오류가 났었다. 배열 자르는 방법의 문제가 아니라 인덱스를 꼼꼼히 고려하지 않아서 난 오류였다. 항상 배열을 다룰 때는 인덱스를 잘 생각하자. 인덱스를 제대로 고쳐주니for문에서도 오류가 나지 않고 정답이 나왔다.
메소드를 쓸 때는 인자를 정확히 알고 쓰자.
Arrays.copyOfRange()의 마지막 인자가 끝 인덱스+1(원래는 그냥 끝 인덱스인데, 이 인덱스 전까지 자르므로 내가 실제 원하는 배열의 끝 인덱스보다는 한 칸 더 갔다고 생각하여 이렇게 표기한다.)이 아니라 얼만큼 자를건지 길이를 쓰는 줄 알았다. 그렇게 했더니 제대로 된 결과가 나오지 않았다. 메소드 정의를 찾아서 인자를 제대로 쓰니까 오류가 나지 않았다.
Arrays.sort()를 이용하여 정렬한다.
Arrays.sort(subArray);
정렬한 subArray에서 k번째 수를 구한다. 입력된 k도 마찬가지로 1부터 시작하는 인덱스 기준으로 입력된 것이기 때문에, 배열에서 쓸 때는 -1을 해줘야 한다.
answer[i] = subArray[commands[i][2]-1];
20분 동안 헤맨 오류가 여기서 난 오류였다. 배열을 자를 때 난 오류라고 생각하고 엉뚱한 데를 계속 고쳤는데, 알고보니 여기에서 입력 인덱스에 -1을 해주지 않아서 난 오류였다. 항상 배열을 쓸 때는 인덱스를 잘 고려해야겠다. 오류가 난 부분도 정확히 찾는 연습을 해야겠다.