티스토리 뷰

반응형

Using Language : Java

Using Tools : IntelliJ


  • "프로그래머스" 라는 사이트에 접속하면 코딩 연습하기에 좋은 사이트라는 것을 알 수 있다!
    문제들이 단계별로 지정되어 있어 원하는 단계를 선택하여 문제를 풀이할 수 있으며,
    사용되어지는 언어까지 선택할 수 있어서 원하는 단계와 언어를 선택하면 맞춤별 문제를 풀이할 수 있다.
    뿐만 아니라, 채점 후 문제를 맞추었으면 다른 사람의 풀이까지 볼 수 있다.

    프로그래머스 사이트

  1. 프로그래머스 문제 소개

<K번째 수>

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때,
commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아
return 하도록 solution 함수를 작성해주세요.

  1. 문제 풀이 과정

문제를 확인하고 하는 일은 제일 먼저 문제의 흐름을 파악하는 것이다.
문제의 흐름을 파악한 후 어떻게 풀이할 것인지 과정을 적어보았다.
1. array를 자른다.
2. 자른 array를 sort함수를 이용하여 정렬시킨다.
3. 정렬된 array중 commands[0][2]-1 값을 뽑아낸다.
(1을 빼는 이유는 배열 Index는 0 부터 시작이기 때문)

과정 순으로 문제를 풀기 위해서 array를 자르는 함수를 먼저 알아보았다.


  • 시행착오 1
    내가 알고있는 원하는 범위를 자르는 함수는 substring이였다.
    아무리 함수를 써봐도 오류 메시지가 확인이 되었고 꽤 오랜시간이 지나서야 substring은
    말그대로 string을 자르는 함수라는 것을 알아냈다..^^;;
    이 경험으로 배열을 자르는 함수를 알아내었다.
    Arrays.copyOf과 Arrays.copyOfRange 총 두가지 함수가 있다.
    전자는 지정된 인덱스부터 배열의 끝까지 추출해주는 함수이고 후자는 인덱스의 시작과 끝을 정하여 배열을 추출하는 함수이다.
    이번 문제를 풀기위해선 Arrays.copyOfRange 함수를 사용하였다.

2, 3번 과정은 쉬운 과정으로 바로 하드 코딩을 하였다.
예시는 총 3가지였고, 나는 하나하나 대입하여 값을 확인하였다.
아래 코드는 첫번째 예시를 대입한 것.

< Solution2.java >

        import java.util.*;
        public class Solution2 {
         
            public int[] solution(int[] array, int[][] commands){
        
                // 1.array를 자른다.
                // 2. 자른 array를 sort를 이용하여 정렬한다.
                // 3. 정렬된 array 중 commands[0][2]-1 값을 뽑아낸다
                // commands 시작값 에서 1 빼는 이유 : 배열의 인덱스는 0부터 시작하기 때문
        
        				// 우선, 하나씩 확인하기 위해서 answer값은 0으로 지정
                int[] answer = {0};
        
                int[] middle = {};
                middle = Arrays.copyOfRange(array,commands[0][0]-1,commands[0][1]-1);
                Arrays.sort(middle);
        
                answer[0] = middle[commands[0][2]-1];
        
               return answer;
            }
        }

< Solution2Test.java >

        import org.junit.Test;
        
        import static org.junit.Assert.assertArrayEquals;
        
        public class Solution2Test {
        
            @Test
            public void 결과() {
                Solution2 solution = new Solution2();
        
                int[] array = {1,5,2,6,3,7,4};
                int[][] commands = {{2,5,3}};
                int[] Return = {5};
                assertArrayEquals(Return,solution.solution(array,commands));
        		}
        }

  • 시행착오 2
    배열을 넣어서 예상값과 실제값을 확인해주는 assertArrayEquals함수 또한 처음 접해보아서 한참 찾아보았다는,,
    assertThat과 assertEquals는 알고있었는데,, 추가 지식 획득이다.


    위 Solution2Test.java를 실행하였을 때 다행스럽게도 예상값과 실제값이 맞았다.
    하지만 다음 예시를 진행하자마자 오류가 터진다. 예상값과 실제값이 다르다고 나오는 오류가 아니었다.


  • 시행착오 3
    두번째 예시는 다음과 같다.

        int[] array = {1,5,2,6,3,7,4};
                int[][] commands = {{4,4,1}};
                int[] Return = {6};
                assertArrayEquals(Return,solution.solution(array,commands));

전의 예제와 다르게 배열을 자를 시작점과 종료점이 같다 (4로 동일).
commands를 확인해보면 4에서 4까지 자른다는 말인데.
Solution2.java를 확인해보면 array 배열 index 에서 3에서 3까지 자른다는 말이고,
그럼 6이 나오는게 맞는데 왜 틀렸을까?
한참 찾아본 결과, Arrays.copyOfRange 함수의 특이점을 알아냈다.
이 함수는 다음과 같이 사용된다.
Arrays.copyOfRange(자를배열이름, 시작점, 종료점)

여기까지 보면 Solution2.java코드의 논리적인 오류가 없다.
하지만 여러번의 검색으로 인해 종료점에 지정된 인덱스는 자른 배열에 포함되지 않는다는 점을 알아냈다.

> **Arrays.copyOfRange(array,commands[0][0]-1,commands[0][1]-1);**

Solution2.java에서 사용된 이 함수는 두번째 예시에 대입하였을때,
배열 index의 3부터 3을 자른다는 것으로 보이지만,
함수의 특성상 3부터 2까지 자른다는 말이 되고 논리적 오류가 발견 되었다.

이 시행착오를 고치는데에 시간이 가장 많이 걸렸다.


  1. 문제 풀이 결과

3번의 시행착오를 겪고 주어진 3가지 예시가 하드코딩으로 모두 완료된 것을 보고 문제를 다시 풀었다.

< Solution2.java >

        import java.util.*;
        public class Solution2 {
         
            public int[] solution(int[] array, int[][] commands){
        
                // 0. answer의 배열 길이 설정해주기
                // 1.array를 자른다. 자르는 시작값 : commands[0][0]-1 종료값 : commands[0][1]
                // 2. 자른 array를 sort를 이용하여 정렬한다.
                // 3. 정렬된 array 중 commands[0][2]-1 값을 뽑아낸다
                // commands 시작값 에서 1 빼는 이유 : 배열의 인덱스는 0부터 시작하기 때문에
        
                int[] answer = new int[commands.length];
                int[] middle = {};
        
                for (int i=0; i<commands.length; i++){
                    middle = Arrays.copyOfRange(array,commands[i][0]-1,commands[i][1]);
                    Arrays.sort(middle);
                    answer[i] = middle[commands[i][2]-1];
                }
               return answer;
            }
        }

< Solution2Test.java >

        import org.junit.Test;
        
        import static org.junit.Assert.assertArrayEquals;
        
        public class Solution2Test {
        
            @Test
            public void 결과() {
                Solution2 solution = new Solution2();
        
                int[] array = {1,5,2,6,3,7,4};
                int[][] commands = {{2,5,3},{4,4,1},{1,7,3}};
                int[] Return = {5,6,3};
                assertArrayEquals(Return,solution.solution(array,commands));
            }
        }

코드 채점결과 ***통과***하였다!

github에서 문제 확인하기

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함