본문 바로가기

알고리즘/Programmers

[Programmers] Level1. K번째 수 (Java)

Level1. K번째 수

문제설명 )

 

 

풀이Code )

더보기
import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int[] solution(int[] array, int[][] commands) {

        int[] answer = new int[commands.length]; // commands 의 수 만큼 return 해줄 배열 선언
        ArrayList<Integer> list = new ArrayList<Integer>(); // 정렬 편하게 하기위한 list 생성

        for (int i=0; i<commands.length; i++) { // commands 의  수만큼 반복
            for (int j = commands[i][0]-1; j < commands[i][1]; j++) {
                    list.add(array[j]); // commands 의 첫번째 인덱스값 ~ 두번째 인덱스값 까지의 array 담기
            }
            Collections.sort(list); // 담아져있는 list 정렬하기
            answer[i] = list.get(commands[i][2]-1); // list 의 값 중 commands 의 세번째 인덱스값에 위치한 값 넣기
            list.clear(); // for 문을 또 돌아서 값을 넣어야 하기때문에 clear 해주기
        }
        return answer;
    }
}

풀이법 )

  1. ArrayList를 사용하여 정렬을 편하게 할수있기 때문에 선언을 해준다.
  2. 2중 for문을 사용하여 commands의 길이만큼 반복하고 for문 자체에 조건문에 j에 commands의 첫번째와 두번째 인덱스의 값을 넣어줌으로 for문을 딱 그만큼만 반복하게끔 한다.
  3. 담겨있는 list를 정렬 후 answer의 위치에 맞게 넣어주고 list를 clear해주면된다.

copyOfRange 메소드를 이용하면 배열에서 원하는 인덱스 ~ 인덱스까지의 값들을 담는법도 있다. ※

 


2021.11.11 재풀이 코드 )

더보기
import java.util.*;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];
        
        // commands 길이만큼 메소드 실행
        for(int i=0; i<commands.length; i++) {
            // 실제 ?번째와 배열길이는 -1의 차이가 난다.
            answer[i] = search(array, commands[i][0]-1, commands[i][1]-1, commands[i][2]-1);
        }
        
        return answer;
    }
    // 배열 정렬 후 숫자찾기 메소드
    private int search(int[] arr, int i, int j, int k) {
        int num = 0;
        // i랑 j의 값이 같으면 자를필요없이 바로 리턴가능
        if(i == j) {
            num = arr[i];
        } else {
            ArrayList<Integer> list = new ArrayList<>();
            // 주어진 길이사이만큼만 반복 
            // j 인덱스에있는 수까지 리스트에 넣어야하므로 <= 로 비교한다.
            for(int z=i; z<=j; z++) {
                list.add(arr[z]);
            }
            // 넣은값 정렬
            Collections.sort(list);
            
            // 문제에서 준 ?번째 값 리턴
            num = list.get(k);
        }
        return num;
    }
}

아주조금 빨라졌다.