

1. 문제설명
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
- array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
- 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
- 2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
- array의 길이는 1 이상 100 이하입니다.
- array의 각 원소는 1 이상 100 이하입니다.
- commands의 길이는 1 이상 50 이하입니다.
- commands의 각 원소는 길이가 3입니다.
입출력 예
array | commands | return |
[1, 5, 2, 6, 3, 7, 4] | [[2, 5, 3], [4, 4, 1], [7, 1, 3]] | [5,6,3] |
입출력 예 설명
[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.
2. 접근방식
2-1. 문제 단순화 & 해결책
Array 라는 배열을 슬라이싱해서 특정 인덱스를 반환 후 배열에 담는 문제
먼저, 리턴값을 담아줄 배열 result를 선언한다.
commands.length의 길이만큼 Loop(for문)을 돌리며 array를 슬라이싱 & 오름차순 정렬 한다.
반복문 for(int i=0; i<commands.length; i++) 일 때 슬라이싱이 수행되는 과정은 아래와 같다.
i번째숫자 | j번째숫자 | k번째숫자 |
commands[i][0]-1 | commands[i][1] | commands[i][2] |
슬라이싱 시작값 | 슬라이싱 끝값 | return 배열에 추가할 값 |
슬라이싱 범위가 command[i][0]-1 에서 command[i][1] 까지인 이유?
문제에서 인간이 배열을 세는 관습(1부터 시작)과 배열 인덱스 시작 번호(0부터 시작)가 다르다는 것이다.
문제에서 '2번째 숫자'는 사실 배열의 2번 인덱스가 아니라 1번 인덱스 값이다.
그래서 실제로 슬라이싱 범위가 commands[i][0]이 아니라 commands[i][0]-1 부터 시작한다.
반면, 끝값은 commands[i][1]-1이 아닌 commands[i][1]이다.
배열 슬라이싱 하는 메서드 Arrays.copyOfRange 는 끝 인덱스를 포함하지 않기 때문이다.
3. 문제풀이
- 슬라이싱 메서드 : Arrays.copyOfRange(배열명, 시작범위, 끝범위)
- 오름차순 정렬 : Arrays.sort()
import java.util.Arrays;
class Solution {
public int[] solution(int[] array, int[][] commands) {
// 1. 결과값 담아줄 정수형 배열 result 선언
int[] result = new int[commands.length];
for (int i = 0; i < commands.length; i++) {
// 2. array 배열 돌면서 각 commands 요소의
// i번째숫자, j번째숫자를 인자로 슬라이싱
// 슬라이싱한 배열을 slicedArray에 담아줌
int[] slicedArray = Arrays.copyOfRange(array,
commands[i][0]-1, commands[i][1]);
// 3. 자른 배열 오름차순 정렬
Arrays.sort(slicedArray);
// 4. result에 slicedArray의 k번째 숫자 집어 넣기
result[i] = slicedArray[commands[i][2]-1];
}
return result;
}
}
4. 같은 유형 문제(정렬)
https://awesomepossum.tistory.com/292
[프로그래머스] (Java) 가장 큰 수 문제 풀이 (정렬)
1. 문제설명0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중
awesomepossum.tistory.com
'코딩테스트 > 알고리즘베스트' 카테고리의 다른 글
[프로그래머스] (Java) H-INDEX (정렬) (6) | 2024.11.02 |
---|---|
[프로그래머스] (Java) 가장 큰 수 문제 풀이 (정렬) - compareTo() 메서드 (3) | 2024.11.02 |
[프로그래머스] (Java) 베스트앨범 문제 풀이 (해시) - containsKey, KeySet (2) | 2024.11.01 |
[프로그래머스] (Java) 의상 문제 풀이 (해시) - Iterator, getOrDefault 메서드 (7) | 2024.10.31 |
[프로그래머스] (Java) 전화번호 목록 문제 풀이 (해시) - substring, starsWith 메서드 (4) | 2024.10.31 |


1. 문제설명
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
- array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
- 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
- 2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
- array의 길이는 1 이상 100 이하입니다.
- array의 각 원소는 1 이상 100 이하입니다.
- commands의 길이는 1 이상 50 이하입니다.
- commands의 각 원소는 길이가 3입니다.
입출력 예
array | commands | return |
[1, 5, 2, 6, 3, 7, 4] | [[2, 5, 3], [4, 4, 1], [7, 1, 3]] | [5,6,3] |
입출력 예 설명
[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.
2. 접근방식
2-1. 문제 단순화 & 해결책
Array 라는 배열을 슬라이싱해서 특정 인덱스를 반환 후 배열에 담는 문제
먼저, 리턴값을 담아줄 배열 result를 선언한다.
commands.length의 길이만큼 Loop(for문)을 돌리며 array를 슬라이싱 & 오름차순 정렬 한다.
반복문 for(int i=0; i<commands.length; i++) 일 때 슬라이싱이 수행되는 과정은 아래와 같다.
i번째숫자 | j번째숫자 | k번째숫자 |
commands[i][0]-1 | commands[i][1] | commands[i][2] |
슬라이싱 시작값 | 슬라이싱 끝값 | return 배열에 추가할 값 |
슬라이싱 범위가 command[i][0]-1 에서 command[i][1] 까지인 이유?
문제에서 인간이 배열을 세는 관습(1부터 시작)과 배열 인덱스 시작 번호(0부터 시작)가 다르다는 것이다.
문제에서 '2번째 숫자'는 사실 배열의 2번 인덱스가 아니라 1번 인덱스 값이다.
그래서 실제로 슬라이싱 범위가 commands[i][0]이 아니라 commands[i][0]-1 부터 시작한다.
반면, 끝값은 commands[i][1]-1이 아닌 commands[i][1]이다.
배열 슬라이싱 하는 메서드 Arrays.copyOfRange 는 끝 인덱스를 포함하지 않기 때문이다.
3. 문제풀이
- 슬라이싱 메서드 : Arrays.copyOfRange(배열명, 시작범위, 끝범위)
- 오름차순 정렬 : Arrays.sort()
import java.util.Arrays; class Solution { public int[] solution(int[] array, int[][] commands) { // 1. 결과값 담아줄 정수형 배열 result 선언 int[] result = new int[commands.length]; for (int i = 0; i < commands.length; i++) { // 2. array 배열 돌면서 각 commands 요소의 // i번째숫자, j번째숫자를 인자로 슬라이싱 // 슬라이싱한 배열을 slicedArray에 담아줌 int[] slicedArray = Arrays.copyOfRange(array, commands[i][0]-1, commands[i][1]); // 3. 자른 배열 오름차순 정렬 Arrays.sort(slicedArray); // 4. result에 slicedArray의 k번째 숫자 집어 넣기 result[i] = slicedArray[commands[i][2]-1]; } return result; } }
4. 같은 유형 문제(정렬)
https://awesomepossum.tistory.com/292
[프로그래머스] (Java) 가장 큰 수 문제 풀이 (정렬)
1. 문제설명0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중
awesomepossum.tistory.com
'코딩테스트 > 알고리즘베스트' 카테고리의 다른 글
[프로그래머스] (Java) H-INDEX (정렬) (6) | 2024.11.02 |
---|---|
[프로그래머스] (Java) 가장 큰 수 문제 풀이 (정렬) - compareTo() 메서드 (3) | 2024.11.02 |
[프로그래머스] (Java) 베스트앨범 문제 풀이 (해시) - containsKey, KeySet (2) | 2024.11.01 |
[프로그래머스] (Java) 의상 문제 풀이 (해시) - Iterator, getOrDefault 메서드 (7) | 2024.10.31 |
[프로그래머스] (Java) 전화번호 목록 문제 풀이 (해시) - substring, starsWith 메서드 (4) | 2024.10.31 |