알고리즘/프로그래머스 일기

[프로그래머스] k번째 수

홍또~ 2020. 5. 28. 18:23

문제:

k번째 수 문제

설계:

 commands 배열은 이차배열이기 떄문에 이중 for문을 써야하지만 열의수는 3으로 고정되어있기때문에 for문을 하나만

사용하기로 설계하였다.

1.for문을 돌려 commands행렬의 각 행마다의 행렬을 획득한다. 

2.그 행렬 안에서 첫번째성분- start포인트 , 두번째성분-end포인트 ,세번째 성분-check포인트 로 변수를 할당한다

3. for문의 마지막에서 arraylist를 선언한 후 list에 조건에 맞는 값을 넣기위해  for문을 돌려 start포인트 - end 포인트까지의 array성분을 add한다

4.완성된 list를  list.sort(null)을 이용해 오른차순으로 sort 한 후 list.get(check포인트)를 통해 arrylist에서 값을 받아와서 answer행렬에다가 저장한다. 

시행착오:

1.코딩을 오랜만에 하다보니까 java의 배열 동적할당을 까먹었었다. 기존에 int [] answer = {}; 로 되어있는것을 그대로 놔두고 짜서 실행헀더니, except java.lang.ArrayIndexOutOfBoundsException 오류가 떠서 한참을 해멧는데 알고보니 answer의 크기를 정해주지않아서였다 new int[commands.length]; 를통해 commands배열의 행의 크기만큼 할당해주었다. 

2.arraylist에 익숙치않아 idex값으로 성분을 가져올때 list.get(check포인트)를 썼으나 또 계속 except java.lang.ArrayIndexOutOfBoundsException 오류가 생겼다.  또 한참을 헤맷는데 list의경우에도 index값은 0부터시작해서 값을가져올때 실제로 찾을 index에 -1를 해주어야했다. TEST CASE에 크기가1인 경우도 있어서 오류가 났던것이다.

코드:

import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];
        int start_point =0;
        int end_point =0;
        int check_point  =0;
        for(int i=0; i<commands.length; i++)
        {
                start_point = commands[i][0];
                end_point = commands[i][1];
                check_point = commands[i][2];
            
            ArrayList<Integer> list = new ArrayList<>();
       
            for(int k=start_point-1; k<end_point; k++)
            {
                list.add(array[k]);
            }
            list.sort(null);
            answer[i] = list.get(check_point-1);     
        }       
        return answer;
    }
}

결과:

실행 결과 화면

한줄평: 머릿속의 생각을 코드로 구현하려면, 기본적인 문법을 잘 알아야한다. 이 문제도 문제풀이 난이도는 매우 낮았으나, 구현을 위한 함수들을 잘 몰라서 구글링하느라 오래걸렸었다. 차차 나아지겠지?...