코딩테스트연습/프로그래머스

[프로그래머스 - JAVA] K번째수

:)jun 2021. 11. 26. 22:58

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

 

코딩테스트 연습 - K번째수

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

programmers.co.kr

//테스트코드
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class Quiz1_KthNumberTest {
    Quiz1_KthNumber q;

    @BeforeEach
    void setUp() {
        q = new Quiz1_KthNumber();
    }

    @Test
    void test1() {
        assertArrayEquals(new int[]{5, 6, 3}, q.solution(new int[]{1, 5, 2, 6, 3, 7, 4}, new int[][]{{2, 5, 3}, {4, 4, 1}, {1, 7, 3}}));
    }
}

//프로덕션코드

import java.util.Arrays;

public class Quiz1_KthNumber {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];


        for (int i = 0; i < commands.length; i++) {
            answer[i] = getNumber(array, commands[i]);
        }


        return answer;
    }

    private int getNumber(int[] array, int[] command) {
        int lengthOfTruncatedArray = command[1] - command[0] + 1;
        int[] truncatedArray = new int[lengthOfTruncatedArray];

        for (int i = 0; i < truncatedArray.length; i++) {
            truncatedArray[i] = array[command[0] - 1 + i];
        }
        Arrays.sort(truncatedArray);

        return truncatedArray[command[2] - 1];
    }
}

// 굿! 코드를 처음 보는 사람도 금방 읽힐 수 있도록 리팩토링!

import java.util.Arrays;

public class Quiz1_KthNumber {
    public int[] solution(int[] array, int[][] commands) {
        int[] answerArray = new int[commands.length];

        getAnswerArray(array, commands, answerArray);

        return answerArray;
    }

    private void getAnswerArray(int[] array, int[][] commands, int[] answerArray) {
        for (int i = 0; i < commands.length; i++) {
            answerArray[i] = getNumber(array, commands[i]);
        }
    }

    private int getNumber(int[] array, int[] command) {
        int lengthOfTruncatedArray = command[1] - command[0] + 1;
        int[] truncatedArray = new int[lengthOfTruncatedArray];

        getTruncatedArray(array, command[0], truncatedArray);
        Arrays.sort(truncatedArray);

        return truncatedArray[command[2] - 1];
    }

    private void getTruncatedArray(int[] array, int i1, int[] truncatedArray) {
        for (int i = 0; i < truncatedArray.length; i++) {
            truncatedArray[i] = array[i1 - 1 + i];
        }
    }
}

// 굿! 더 복잡해보이는건 왜일까... 그래도 필요한 부분만 볼 수 있으니까 이게 유지보수하기 더 좋은 코드겠지? 
// 클린코드, 오브젝트 책 우선 쭉 읽어보고 어느정도 내공이 쌓였을 때 다시 판단해보자.