본문 바로가기
작업/Problem Solving

프로그래머스 코딩 테스트 (K번째 수) - Python3

 

 

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/42748?language=python3 

 

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

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

programmers.co.kr

 

 

문제 설명

 

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4],    i = 2,    j = 5,    k = 3이라면

 

 

1.   array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.

2.   1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.

3.   2에서 나온 배열의 3번째 숫자는 5입니다.

 

 

 

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때,

commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

 

 


제한 사항

 

1.  array의 길이는 1 이상 100 이하입니다.

2.  array의 각 원소는 1 이상 100 이하입니다.

3.  commands의 길이는 1 이상 50 이하입니다.

4.  commands의 각 원소는 길이가 3입니다.

 


입출력 예시

 


 

2차원 리스트인 commands에서 한 묶음씩 원소들을 꺼내와서 array 리스트의 슬라이싱으로 사용합니다.

 

 

실제 리스트의 인덱스는 0임을 인지하고, 이를 바탕으로 인덱스를 다루게 되면

첫 번째 원소는 -1을 해야 시작 인덱스로 활용할 수 있고,

두 번째 원소는 마지막 인덱스로 바로 사용 가능,

세 번째 원소는 -1을 해야 원하는 인덱스로 활용할 수 있다.

 

 

def solution(array, commands):
    answer = []
    for idx in range(len(commands)):
        i = commands[idx][0]
        j = commands[idx][1]
        k = commands[idx][2]
    
        sliced = array[i-1:j]
        sliced.sort()

        answer.append(sliced[k-1])
    return answer
for idx in range(len(commands)):
        i = commands[idx][0]
        j = commands[idx][1]
        k = commands[idx][2]

-> 2차원 리스트에서 1개의 묶음을 가져와 계산에 활용

  sliced = array[i-1:j]
  sliced.sort()

-> 문제에서 요구하는 리스트 슬라이싱을 진행하고, 정렬
answer.append(sliced[k-1])

-> 결과 리스트에서 원소를 추출 후, 정답 리스트에 저장

 

 

 

 

문제를 해결하면 다른 분들의 해답도 볼 수 있습니다.

1줄로 완성하신 분의 코드는 파이썬 문법으로 배울 게 정말 많아서 공부할 겸 작성했습니다.

 

 

 

코드가 1줄이기 때문에 매우 간결하지만, 그 안에 포함된 구조는 어렵게 다가올 수 있습니다.

그래서 하나씩 분해했습니다.


sorted(array[x[0]-1 : x[1]])

 

 

sorted()는 정렬해주는 함수입니다. array[x[0]-1 : x[1]]의 슬라이싱 부분을 정렬하겠다는 의미입니다.

그럼 여기서 x는 어떤 값일까요?

 


lambda x: sorted(array[x[0]-1 : x[1]])[x[2]-1]

 

 

좀 더 확장해서 lambda 범위까지 포함했습니다. lambda는 효율적인 함수 표현을 가능하게 해 줍니다.

x는 lambda의 인자이며 콜론(:)을 기준으로 우측은 x를 활용한 표현식이 되는 것입니다.

 

하지만, 이 과정에서까지 x가 정확히 어디서 가져온 값인지 확인할 수 없습니다.


map(lambda x:sorted(array[x[0]-1 :x[1]])[x[2]-1], commands)

 

 

map() 함수까지 확장하면 x의 출처를 확인할 수 있습니다.

map() 함수는 (적용 함수, iterable 객체)의 매개변수를 받습니다.

 

 

map의 역할은 iterable 객체를 적용 함수에 사용할 수 있도록 합니다.

계산 결과로 나타나는 값은 튜플(tuple) 형태로 반환합니다.

 

 

여기서 x는 commands의 원소를 가져와 활용한다는 것을 알 수 있습니다.

 

 

x[0]-1  = 작성한 코드의 i-1

x[1]     = 코드의 j

x[2]-1  = 코드의 k-1

 

 

array[x[0]-1:x[1]]  = array[i-1: j]

 

 

sorted(array[x[0]-1:x[1]])[x[2]-1]

        sliced = array[i-1:j]
        sliced.sort()

 

 

 

map() 함수에 의해서 최종적으로 반환되는 결과는 튜플이기 때문에

문제에서 표현되는 리스트로 변환하기 위해 마지막에 list() 함수를 사용하는 것입니다.

 

많이 배우고 갑니다...!

 

 

- 끝 -