본문 바로가기

개발일지

20231205 - 프로그래머스/42748

https://school.programmers.co.kr/learn/courses/30/lessons/42748

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때 k 번째 있는 수 구하기

 

제한 사항

array의 길이는 1이상 100이하

array의 각 원소는 1이상 100이하

commands의 길이는 1이상 50이하

commands의 각 원소는 길이가 3

 

예시

array : [1, 5, 2, 6, 3, 7, 4]

commands : [[2, 5, 3], [4, 4, 1], [1, 7, 3]]

결과 : [5, 6, 3]

 

풀이 과정

문제를 이해하는데에도 꽤나 시간이 들었다. 2차원배열 commands의 첫 번째 원소로 보면 i가 2, j가 5 k가 3으로 주어졌다. 그러면 2번째 원소부터 5번째 원소까지 자르고 그 배열을 정렬했을 때 3번째 원소를 찾는 것이다. 우선 2차원 배열의 원소들을 모두 돌기 위해 for문을 두 번 사용했다. 그리고 해당하는 범위만큼 리스트에 넣어주고 정렬한 다음 원하는 위치에 있는 값을 반환할 정답 배열에 넣고 리스트를 다시 초기화 해주었다. 그리고 commands의 모든 원소를 돌 때 까지 반복한다. 다른 사람의 풀이 방법을 확인해 보면 Arrays.copyOfRange() 를 통해 원하는 범위만큼 잘라내는 과정을 쉽게 풀어낸 사람들도 많이 보였다. 아무래도 이 방법을 쓰면 코드가 짧아져 가독성은 훨씬 좋아지는 것 같다.

 

import java.util.*;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];
        List<Integer> intList = new ArrayList<>();
        for(int i=0; i<commands.length; i++){
            for(int j=commands[i][0]; j<=commands[i][1]; j++){
                intList.add(array[j-1]);
            }
            Collections.sort(intList);
            answer[i] = intList.get(commands[i][2]-1);
            intList.clear();
        }
        return answer;
    }
}