ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 15. K번째수
    코딩 테스트/Level 1 2019. 10. 13. 23:02
    반응형

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

     

    파이썬

    뭐라 뭐라 복잡하게 적어두었지만 차근차근 작성하면 다음과 같습니다. 

    def solution(array, commands):
        answer = []
        for i, j, k in commands:
            a = array[i - 1:j]
            a.sort()
            answer.append(a[k - 1])
        return answer

    for와 리스트가 보인다면 리스트 컴프리헨션을 떠올려 보면 좋습니다. 

    sort()와 sorted()의 차이도 설명드렸죠?
    https://inma.tistory.com/137

    def solution(array, commands):
        return [sorted(array[i - 1:j])[k - 1] for i, j, k in commands]

     

     

    자바스크립트

    함수형으로 풀어봅니다.

    function solution(array, commands) {
        var answer = [];
        commands.forEach( command => { 
            answer.push(
                array
                    .slice(command[0]-1,command[1])
                    .sort(function(a, b){return a - b})[command[2]-1])
        });
        return answer;
    }

    answer 배열을 생성하지 않고 map을 이용해서 바로 리턴하면 코드를 더 줄일 수 있습니다. 

    https://www.zerocho.com/category/JavaScript/post/5acafb05f24445001b8d796d

    function solution(array, commands) {
        return commands.map( command => { 
            return array
                .slice(command[0]-1,command[1])
                .sort(function(a, b){return a - b})[command[2]-1]
        });
    }
    function solution(array, commands) {
        return commands.map( command => { 
            return array
                .slice(command[0]-1,command[1])
                .sort((a, b) => a - b)[command[2]-1]
        });
    }

     

    자바

    요즘엔 주로 파이썬을 쓰는데, 오래간만에 자바를 보니 눈물이 앞을 가립니다. ㅠ,.ㅠ 

    코드가 복잡합니다. 취미 코딩엔 파이썬이 좋은 것 같습니다. 

    어레이 클래스의 API는 다음 링크를 참고하십시오.  

    https://palpit.tistory.com/902

    import java.util.Arrays;
    
    class Solution {
        public int[] solution(int[] array, int[][] commands) {
            int[] ret = new int[commands.length];
            for (short i = 0; i < commands.length; i++) {
                int[] temp = Arrays.copyOfRange(array, commands[i][0]-1, commands[i][1]);
                Arrays.sort(temp);
                ret[i] = temp[commands[i][2]-1];
            }
            return ret;
        }
    }

     

    고의 슬라이스(배열)가 참조형으로 작동함을 알아야 풀 수 있습니다.

    슬라이스는 실제 배열을 가리키는 포인트 정보만을 가집니다. 

    실제 데이터를 복제하려면 명시적으로 copy명령을 써야 합니다. 

    copy를 쓰지 않고 슬라이스를 바인딩한 뒤 sort를 하면 원본 슬라이스의 순서가 바뀝니다. 

    import "sort"
    
    func solution(array []int, commands [][]int) (rtn []int) {
    	for _, v := range commands {
    		newSlide := make([]int, v[1]-v[0]+1)
    		copy(newSlide, array[v[0]-1:v[1]])
    		sort.Ints(newSlide)
    		rtn = append(rtn, newSlide[v[2]-1])
    	}
    	return
    }

    append를 이용해 초기화와 카피를 동시에 해주는 방법도 있습니다. 

    생략 부호(...)는 슬라이스의 모든 요소들의 '집합'을 나타냅니다. 

    newSlide := []int{array[v[0]-1:v[1]]...} 은 안됩니다. 요소들을 집어넣어야 하는데 집합을 넣었죠?

    import "sort"
    
    func solution(array []int, commands [][]int) (rtn []int) {
    	for _, v := range commands {
    		newSlide := append([]int{}, array[v[0]-1:v[1]]...)
    		sort.Ints(newSlide)
    		rtn = append(rtn, newSlide[v[2]-1])
    	}
    	return
    }

    코틀린

    함수형으로 풀어보았습니다. 

    class Solution {
        fun solution(array: IntArray, commands: Array<IntArray>): IntArray {
            return commands
                .map { it -> // it -> 생략가능
                    array
                        .slice((it[0] - 1) until it[1])
                        .sorted()[it[2] - 1]
                }.toIntArray()
        }
    }

    코뽐용으로는 이렇게... 

    class Solution {
        fun solution(array: IntArray, commands: Array<IntArray>): IntArray {
            return commands.map { array.slice((it[0] - 1) until it[1]).sorted()[it[2] - 1] }.toIntArray()
        }
    }

    C#

    배열의 슬라이스는 C# 8.0 부터 지원하는데... (프로그래머스의 C#버전은 그 보다 낮아서...)

    크기가 같은 2차원배열과 재그배열의 차이를 알고 있어야 쉽게 풀 수 있습니다. 

    public class Solution
    {
        public int[] solution(int[] array, int[,] commands)
        {
            int[] answer = new int[commands.GetLength(0)];
            for (int i = 0; i < commands.GetLength(0); i++)
            {
                int[] temp = array[(commands[i, 0] - 1)..commands[i, 1]];
                Array.Sort(temp);
                answer[i] = temp[commands[i, 2] - 1];
            }
            return answer;
        }
    }

    List를 이용해 봅니다. 

    using System.Collections.Generic;
    
    public class Solution
    {
        public int[] solution(int[] array, int[,] commands)
        {
            int[] answer = new int[commands.GetLength(0)];
            for (int i = 0; i < commands.GetLength(0); i++)
            {
                List<int> temp = new List<int>(array);
                temp = temp.GetRange(commands[i, 0] - 1, commands[i, 1] - commands[i, 0]+1);
                temp.Sort();
                answer[i] = temp[commands[i, 2] - 1];
            }
            return answer;
        }
    }

    ArraySegment

    using System;
    
    public class Solution
    {
        public int[] solution(int[] array, int[,] commands)
        {
            int[] answer = new int[commands.GetLength(0)];
            for (int i = 0; i < commands.GetLength(0); i++)
            {          
                int[] temp = new ArraySegment<int>(array, commands[i, 0] - 1, commands[i, 1] - commands[i, 0] + 1).ToArray();
                Array.Sort(temp);
                answer[i] = temp[commands[i, 2] - 1];
            }
            return answer;
        }
    }
    반응형
Designed by Tistory.