[Level1] K번째수 답안 및 풀이
◇ 문제 설명
배열 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], [1, 7, 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입니다.
◇ 초기 내용
※ [출처] 프로그래머스-코딩테스트 연습-문제명
※ 초기 내용을 참고하여 문제에 맞는 코드를 작성하세요.
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = {};
return answer;
}
}
◇ 답안
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = new int[commands.length];
for(int i = 0; i<commands.length; i++){
int between[] = new int[commands[i][1] - commands[i][0] +1];
int r = 0;
for(int j = commands[i][0]-1; j<commands[i][1]; j++){
between[r] = array[j];
r++;
}
sort(between);
answer[i] = between[commands[i][2]-1];
}
return answer;
}
public int[] sort(int[] array){
for(int i = 0; i<array.length-1; i++){
for(int j = i + 1; j<array.length; j++){
if(array[i]>array[j]){
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
return array;
}
}
◇ 답안 힌트
▶ 정렬 방법에는 다양한 방법이 있다.
▶ 2차원 배열을 사용하므로 배열의 인덱스 크기에 유의하자(문제의 ~번째 방과 혼돈하지 말자)
◇ 답안 풀이
(※ 실행 흐름 순으로 해석됩니다.)
class Solution {
public int[] solution(int[] array, int[][] commands) {
//answer은 각 commands의 조건에 맞는 하나의 값들을 가지므로
//commands의 1차원 배열의 개수와 같다.
int[] answer = new int[commands.length];
for(int i = 0; i<commands.length; i++){
//between은 (문제상의 i와 j)array[i]~array[j]사이의 값들을 저장하는 배열
int between[] = new int[commands[i][1] - commands[i][0] +1];
int r = 0;
//각 commands에 맞는 값을 가져오기 위해 for반복문 실행
//인덱스는 0부터 시작하므로 2번째 값은 1번방에 들어있다.
//그러므로 commands[i][0]-1을 한 값이 문제에서 정의하는 ~번째값을 가리키며,
//문제 내에서 j값을 포함하여 추출하므로 commands[i][1]의 미만 만큼 반복문을 돌려 실행
//그 값에 맞는 array인덱스 값을 between에 저장
for(int j = commands[i][0]-1; j<commands[i][1]; j++){
between[r] = array[j];
r++;
}
//between을 오름차순으로 정렬(메서드 호출)
sort(between);
//정렬된 between의 commands[i][2]-1(인덱스는 0부터 시작)번째 방을 answer[i]에 저장
answer[i] = between[commands[i][2]-1];
}
return answer;
}
//정렬
public int[] sort(int[] array){
//다양한 정렬 알고리즘 중 선택정렬(selection sort)사용
for(int i = 0; i<array.length-1; i++){
for(int j = i + 1; j<array.length; j++){
if(array[i]>array[j]){
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
return array;
}
◇ 실행결과
◇ 출처
https://programmers.co.kr/learn/challenges
코딩테스트 연습
기초부터 차근차근, 직접 코드를 작성해 보세요.
programmers.co.kr