본문 바로가기
ALGORITHM/Sorting

[JAVA] 프로그래머스 K번째수

by sjs_2215 2019. 6. 24.

문제: K번째수 https://programmers.co.kr/learn/courses/30/lessons/42748

[k번째수]

  • 문제 재정의:

원본 배열 array (input)

commands. [i=나눌 배열 첫번째 인덱스 번호, j=마지막 인덱스 번호, k=return할 인덱스 번호 ] (input)

commands의 인덱스2의 값을 배열에 담아 return

이클립스에서 할 때 commands 몇개 넣을지 숫자도 input 받기 (편의상)

commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.


  • 생각한 것:
  1. 정렬함수 만들어서 정렬함수 매개변수에 commands 에서 정렬, 그리고 답 return

    • sort(배열, fromIndex, toIndex) 사용

    Sort() 세번째 : Sort(array, int fromindex, int toindex)

    인덱스의 시작과 끝을 정해 fromindex부터 toindex-1까지만 오름차순 정렬할 수도 있다.

    -> 그래서

                Arrays.sort(array, commands[i][0]-1,commands[i][1]);
    //array 배열 인덱스 0부터 데이터가 있는데, 문제선 0인덱스 안쳐주고 input하기 때문에 commands[i][0]-1
    //Arrays.sort()는  toindex-1까지만 정렬한다. 근데 문제에선 0 인덱스 안쳐주고 input하기 때문에 commands[i][1] 
  1. return 받은 것 main에서 받아서 answer배열에 저장 후 main에서 출력

  • 코드:
//BufferedReader 사용
package till;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // StringTokenizer 객체 선언
        StringTokenizer st = null;

        // String Line이므로 Integer.parseInt를 이용하여 형변환해야함
        int n = Integer.parseInt(br.readLine()); //배열 length 미리 받기 (편의상)

        int[] arrays = new int[n];
        st = new StringTokenizer(br.readLine()); //stringtokenizer 공백 기준으로  나누고 

        for(int i=0;i<n;i++){
            arrays[i]=Integer.parseInt(st.nextToken());//int로 형변환 해주면서 배열에 저장
        }

        int [][]keywords={{2,5,3},
                          {4,4,1},
                          {1,7,3}};

        solution(arrays, keywords);

    }

    public static int[] solution(int[] array, int[][] commands) {
        //answer 배열에 담아 return할 것임 
        int[] answer = new int[50];

        //정렬
        for(int i=0;i<commands.length;i++){
            int temp=sort_only(array, commands[i][0],commands[i][1], commands[i][2]);
            answer[i]=temp; //해당 인덱스 값 answer에 저장
        }

        for(int a:answer)
            System.out.println(a);

        return answer;
    }

    public static int sort_only(int[] array, int i, int j,int k){
        int x=0;

        //int[] copy_array = Arrays.copyOf(array,array.length);
        Arrays.sort(array, i-1,j);
        x=array[i+k-2];

        return x;
    }
}

정렬된 배열을 또 정렬하는 문제점 발생

해결한 방법:

-> 2중 for문 사용.

->매번 j-i한 만큼의 새로운 temp 배열을 만들어서, i부터 j까지 원본 배열 똑 떼어서 temp에 복붙함

-> 그리고나서 temp 배열을 sort 하는 방식으로 함

//프로그래머스 성공 코드
import java.util.Arrays;
class Solution {
    public int[] solution(int[] array, int[][] commands) {
         //answer 배열에 담아 return할 것임 
        int[] answer = new int[commands.length];


        for(int i=0;i<commands.length;i++){
        int[] temp = new int[commands[i][1]-commands[i][0]+1]; //각 commands 행마다 정렬해야하는 배열 길이대로 매번 배열 생성
        int x=commands[i][0]-1;
        for(int j=0;j<temp.length;j++){
            temp[j]=array[x];x++; //새로 만든 배열에 자른 배열 집어넣기
            //System.out.print(temp[j]+" ");
        }
        answer[i]=sort_only(temp, commands[i][2]);

        //System.out.println("");
        }                
        return answer;
    }

    public static int sort_only(int[] array,int k){
        int x=0;

        Arrays.sort(array);

        x=array[k-1];
        //System.out.println("각정답: "+x);
        return x;
    }
}

&

//이클립스 성공 코드
//BufferedReader 사용
package till;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // StringTokenizer 객체 선언
        StringTokenizer st = null;

        // String Line이므로 Integer.parseInt를 이용하여 형변환해야함
        int n = Integer.parseInt(br.readLine()); //배열 length 미리 받기 (편의상)

        int[] arrays = new int[n];
        st = new StringTokenizer(br.readLine()); //stringtokenizer 공백 기준으로  나누고 

        for(int i=0;i<n;i++){
            arrays[i]=Integer.parseInt(st.nextToken());//int로 형변환 해주면서 배열에 저장
        }

        int [][]keywords={{2,5,3},
                          {4,4,1},
                          {1,7,3}};

        solution(arrays, keywords);

    }

    public static int[] solution(int[] array, int[][] commands) {
        //answer 배열에 담아 return할 것임 
        int[] answer = new int[commands.length];


        for(int i=0;i<commands.length;i++){
        int[] temp = new int[commands[i][1]-commands[i][0]+1]; //각 commands 행마다 정렬해야하는 배열 길이대로 매번 배열 생성
        int x=commands[i][0]-1;
        for(int j=0;j<temp.length;j++){
            temp[j]=array[x];x++; //새로 만든 배열에 자른 배열 집어넣기
            System.out.print(temp[j]+" ");
        }
        sort_only(temp, commands[i][2]);

        System.out.println("");
        }



        return answer;
    }

    public static int sort_only(int[] array,int k){
        int x=0;

        Arrays.sort(array);

        x=array[k-1];
        System.out.println("각정답: "+x);
        return x;
    }
}

##

'ALGORITHM > Sorting' 카테고리의 다른 글

[JAVA] 프로그래머스 H-Index  (0) 2019.06.24
[JAVA] 백준 8979번  (0) 2019.06.02

Comments