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

ddurru·2024년 4월 15일
0

코딩테스트

목록 보기
2/15

문제 설명

배열 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 함수를 작성해주세요.

제한사항

array의 길이는 1 이상 100 이하입니다.
array의 각 원소는 1 이상 100 이하입니다.
commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.

풀이 00

  1. i부터 j까지 인덱싱
  2. 오름차순 정렬
  3. k번째 순서에 있는 배열의 값
def solution(array, commands):
    answer = []

    for i in range(len(commands)):
        numbers = array[commands[i][0]-1:commands[i][1]]
        numbers.sort()
        answer.append(numbers[commands[i][2]-1])
        
    return answer

풀이 01

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


# 위 과정을 풀어서 쓴 코드 
def solution(array, commands):
    answer = []
    
    for command in commands:
        i, j, k = command
        numbers = array[i-1:j]
        numbers = sorted(numbers)
        answer.append(numbers[k-1])
    return answer

commands는 다차원 배열로 이루어져 있는데 이를 for문을 통해 하나씩 가져와 배열 안에 있는 세 개의 숫자를 i,j,k에 할당하도록 한다.
이후,array[i-1:j]는 array에서 i번째 인덱스부터 j번째 인덱스까지 부분 배열을 추출한다. 다음으로 sorted를 통해 정렬을 한 후, [k-1]는 정렬된 부분 배열에서 k번째 인덱스에 있는 값을 찾아 answer 리스트에 추가한다.

참고로 sorted()의 결과는 리스트이기 때문에 list(sorted(...)) 에서 list는 제거해도 괜찮다!

이와 더불어 다음과 같이 sort, sorted에 대한 차이를 찾아보았다.

  • sort, sorted 차이
  1. sort와 sorted 메서드는 이름은 비슷해 보이지만 서로 다른 역할을 하는 메서드
  2. sort 함수는 list 클래스의 메서드로 list 객체에서만 사용이 가능
  3. sorted 함수는 iterable 객체(list, string, tuple, dictionary, set ...)를 파라미터로 받을 수 있는 메서드
# sort 
list.sort(key, reverse=False)  # key, reverse 파라미터 조정 가능 
>>> 기본적으로 오름차순이며, 리스트 객체 자체를 정렬하며 반환하는 값은 None 
>>> 따라서, a = list.sort() 사용은 불가 

# sorted 
a.sorted(iterable, key, reverse=False)  # key, reverse 파라미터 조정 가능 
>>> sorted 메서드는 iterable 객체를 파라미터로 받는 메서드이며  기본적으로 오름차순으로 객체를 정렬하고, 정렬된 iterable을 반환 
>>> 따라서, b = sorted(a) 사용 가능 

계산량이 많지 않을 경우, 두 메서드 모두 속도가 비슷하지만 계산량이 많아질 경우 sorted는 새로운 객체를 생성해야 하는 오버헤드가 발생할 수 있기 때문에 sort보다 시간이 더 걸릴 수 있다!

하지만 두 메서드 모두 애초에 반환값이 다른 메서드이므로 용도가 다르다.
sort의 경우, 객체 자체를 정렬하고 싶을 때 사용하면 좋을 것이고 sorted는 기존 list의 정렬 정보가 유의미하며 다른 객체를 생성하여 저장하고 싶을 때 사용하도록 하자.

(즉, list가 아닌 iterable에서는 sorted를 사용해야 한다는 것)


참고

profile
2024.04.15 ~

0개의 댓글