코딩테스트/Java

[Level1] K번째수 답안 및 풀이

SRin23 2021. 6. 16. 20:18

◇ 문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 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;
}
                

 

◇ 실행결과

K번째 수 실행결과

 

◇ 출처

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr