NIRVANA

[level 1] K번째수 본문

Coding test(Python3)/Programmers

[level 1] K번째수

녜잉 2023. 7. 29. 22:22

문제 

배열 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

 

1) len(commands)길이 만큼 반복코드를 반복한다. 이때, commands가 이차원 배열이므로 이중 반복문을 사용해서 commands의 원소에 접근한다. 

2) 반복문에서 commands의 각 원소를 담아 놓을 배열 n과 슬라이싱한 배열을 담아 놓을 배열 s를 선언한다. 

3) command의 i, j, k를 담아 놓은 배열 n을 사용하여서 i~j번까지 슬라이싱한 array 배열을 배열s에 넣은 뒤 sort()를 사용하여서 정렬한다. 

4) array를 조건에 맞게 슬라이싱한 배열 s의 k번째의 원소를 answer에 추가한다. 

*해당 문제에서 배열에서 저장하는 원래 인덱싱(0~)이 아니라 1부터 시작했기 때문에 a와 k는 원래 수에서 1씩 빼주었다! b의 경우 어차피 슬라이싱이 -1이므로 하지 않았다. 

def solution(array, commands):
    answer = []
    
    for i in range(len(commands)):
        n = []
        s = []
        for j in range(len(commands)):
            n.append(commands[i][j])
    
        a = n[0] -1
        b = n[1]
        k = n[2]-1
 
    
        s = array[a:b]
        s.sort()
    
        answer.append(s[k])

    return answer

샘플 테스트 케이스는 성공했는데... 런타임에러가 떴다.

이유는 commands의 각 원소의 길이는 3이기 때문이다.  따라서 commands의 각 원소를 따로 저장하는 두번째 반복문에서는 len(commands)가 아니라 걍 3을 해야함!!

 

 

문제 풀이 접근법2

두번째 반복문의 길이를 3을 수정하였다. 

def solution(array, commands):
    answer = []
    
    for i in range(len(commands)):
        n = []
        s = []
        for j in range(3):
            n.append(commands[i][j])
    
        a = n[0] -1
        b = n[1]
        k = n[2]-1
 
    
        s = array[a:b]
        s.sort()
    
        answer.append(s[k])

    return answer

 

 


다른 분들 풀이

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

람다를 이용해서 푼게 인상 깊었다.

람다...공부해야지 진짜

 

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

맞다 파이썬은 이렇게 할 수 있었지. 그냥 리스트에서 원소 가져와서 바로 넣을 수 있지!!!

그걸 까먹고 있었네....

 

for commands in commands:
    
    i, j, k = commands
    
    answer.append(sorted(array[i-1:j])[k-1])
    
print(answer)

list()는 사용하지 않아도 정답이 된다!(array를 슬라이싱한 것도 어차피 리스트이니까...)