문제: 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입니다.
- 생각한 것:
정렬함수 만들어서 정렬함수 매개변수에 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]
- 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