촬리의늘솔길

[프로그래머스] - 정렬 : K번째 수 본문

✍️2023/Algorithm

[프로그래머스] - 정렬 : K번째 수

리촬리 2023. 9. 13. 00:21

문제 설명

  • Input
    • 배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수
  • Output
    • commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return
  • Constraints
    • array의 길이는 1 이상 100 이하입니다.
    • array의 각 원소는 1 이상 100 이하입니다.
    • commands의 길이는 1 이상 50 이하입니다.
    • commands의 각 원소는 길이가 3입니다.
  • Edge casesarray commands return
    [1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

알고리즘

  • 정렬
    • Sorted
  • 시간복잡도
    • 최악
    • 최선

코드

(생각을 너무 오래해서 포기했습니다 - 다른 사람코드에요)

def solution(array, commands):
    answer = []
    
    for i in commands:
        ary = array[i[0]-1: i[1]]    # 문제에서 주어진 크기만큼 자르기
        ary.sort()    # sort 함수로 정렬
        answer.append(ary[i[2]-1])    # k 번째 값 집어넣기
        
    return answer

아…파이썬에 sort 함수가…있었…….

가장 "좋아요" 를 많이 받은 풀이

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

설명

뭔가를 해보려고는 했던 흔적

  • 슬라이싱을 하면 될 것 같다고 생각함
  • 정렬을 하면 될 것 같다고 생각함
    • 근데 어떤 정렬을 써야 할까 고민함
    • 파이썬으로 2차원 배열 어떻게 입력 받을까를 고민함
      • 이것도 파이썬을 잘 몰라 벌어진..
    • 프로그래머스는 입출력을 구현할 필요가 없다는 것을 뒤늦게 깨달음

2차원 배열 입력 받는 법

선언과 동시에 입력받기

arr = [list(map(int, input().split())) for _ in range(B)]

원소에 list 추가하기

arr = []

for i in range(B):    
	arr.append(list(map(int, input().split())))

원소 하나씩 입력받기

arr = [for _ in range(B)] // 2차원 배열의 가로길이 : B

for i in range(B):    
	arr[i] = list(map(int, input().split()))

정렬 함수

파이썬 리스트는 sort() 라는 메소드를 가지고 이 메소드는 리스트를 정렬된 상태로 변경한다.

sorted() 내장 함수

파이썬에서 정렬을 할 때 가장 부담없이 사용할 수 있는 방법은 내장된 sorted() 함수를 이용하는 것입니다.

sorted() 내장 함수는 파이썬에서 순회가 가능한(iterable) 객체를 인자로 받아 데이터를 정렬해줄 수 있습니다.

>>> sorted([3, 5, 2, 1, 4])
[1, 2, 3, 4, 5]
>>> sorted(["D", "A", "C", "B", "E"])
['A', 'B', 'C', 'D', 'E']

sorted() 내장 함수는 인자로 넘어온 객체의 원래 순서를 건드리지 않고 정렬된 원소들을 새로운 객체에 담아서 반환해줍니다.

>>> nums = [3, 5, 2, 1, 4]
>>> sorted_nums = sorted(nums)
>>> print(nums)
[3, 5, 2, 1, 4]
>>> print(sorted_nums)
[1, 2, 3, 4, 5]

파이썬에서는 리스트(list) 뿐만 아니라, 튜플(tuple), 세트(set), 문자열(string)과 같은 다른 자료형도 순회가 가능하죠? 따라서 이러한 자료형의 인자와 함께 sorted() 함수를 호출할 수 있으며 이 때 주의할 점은 입력 자료형과 무방하게 항상 리스트가 반환된다는 것입니다.

>>> sorted((3, 5, 2, 1, 4))
[1, 2, 3, 4, 5]
>>> sorted({3, 5, 2, 1, 4})
[1, 2, 3, 4, 5]
>>> sorted("35214")
['1', '2', '3', '4', '5']

map 과 lambda 함수

  • map 과 lambda 함수map(함수, 리스트) 여러 개의 데이터를 한번에 다른 형태로 변환하기 위해서 사용됩니다.
  • lambda 인자 : 표현식
  • >>> ls = ['1','2','3'] >>> list(map(int, ls)) >>> [1, 2, 3] >>> set(map(lambda x: x ** 2, range(5))) >>> {0, 1, 4, 9, 16}

어려웠던 점

총체적 난국 그 자체

1. 파이썬을 잘 모름

  • C++ 에 익숙해졌어서 수작업하는 편..(?) 인것같다..
  • 코테에 쓰이는 파이썬 함수나 라이브러리도 같이 익혀야 할 것 같다.
  • 함수 쓰면 금방 끝나는데 이건 또 언제 다 공부하고 외우지요

2. 자료구조 및 알고리즘 개념도 잘 모름

  • 물론 배웠던 것 같은데 까먹음
  • 정렬중에 어떤게 어느때에 사용되는지 모르겠다.
  • 정렬 자체를 정확하게 모른다.

알고리즘

  • 정렬
    • Sorted
  • 시간복잡도
    • 최악
    • 최선

코드

(생각을 너무 오래해서 포기했습니다 - 다른 사람코드에요)

def solution(array, commands):
    answer = []
    
    for i in commands:
        ary = array[i[0]-1: i[1]]    # 문제에서 주어진 크기만큼 자르기
        ary.sort()    # sort 함수로 정렬
        answer.append(ary[i[2]-1])    # k 번째 값 집어넣기
        
    return answer

아…파이썬에 sort 함수가…있었…….

가장 "좋아요" 를 많이 받은 풀이

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

설명

뭔가를 해보려고는 했던 흔적

  • 슬라이싱을 하면 될 것 같다고 생각함
  • 정렬을 하면 될 것 같다고 생각함
    • 근데 어떤 정렬을 써야 할까 고민함
    • 파이썬으로 2차원 배열 어떻게 입력 받을까를 고민함
      • 이것도 파이썬을 잘 몰라 벌어진..
    • 프로그래머스는 입출력을 구현할 필요가 없다는 것을 뒤늦게 깨달음

2차원 배열 입력 받는 법

선언과 동시에 입력받기

arr = [list(map(int, input().split())) for _ in range(B)]

원소에 list 추가하기

arr = []

for i in range(B):    
	arr.append(list(map(int, input().split())))

원소 하나씩 입력받기

arr = [for _ in range(B)] // 2차원 배열의 가로길이 : B

for i in range(B):    
	arr[i] = list(map(int, input().split()))

정렬 함수

파이썬 리스트는 sort() 라는 메소드를 가지고 이 메소드는 리스트를 정렬된 상태로 변경한다.

sorted() 내장 함수

파이썬에서 정렬을 할 때 가장 부담없이 사용할 수 있는 방법은 내장된 sorted() 함수를 이용하는 것입니다.

sorted() 내장 함수는 파이썬에서 순회가 가능한(iterable) 객체를 인자로 받아 데이터를 정렬해줄 수 있습니다.

>>> sorted([3, 5, 2, 1, 4])
[1, 2, 3, 4, 5]
>>> sorted(["D", "A", "C", "B", "E"])
['A', 'B', 'C', 'D', 'E']

sorted() 내장 함수는 인자로 넘어온 객체의 원래 순서를 건드리지 않고 정렬된 원소들을 새로운 객체에 담아서 반환해줍니다.

>>> nums = [3, 5, 2, 1, 4]
>>> sorted_nums = sorted(nums)
>>> print(nums)
[3, 5, 2, 1, 4]
>>> print(sorted_nums)
[1, 2, 3, 4, 5]

파이썬에서는 리스트(list) 뿐만 아니라, 튜플(tuple), 세트(set), 문자열(string)과 같은 다른 자료형도 순회가 가능하죠? 따라서 이러한 자료형의 인자와 함께 sorted() 함수를 호출할 수 있으며 이 때 주의할 점은 입력 자료형과 무방하게 항상 리스트가 반환된다는 것입니다.

>>> sorted((3, 5, 2, 1, 4))
[1, 2, 3, 4, 5]
>>> sorted({3, 5, 2, 1, 4})
[1, 2, 3, 4, 5]
>>> sorted("35214")
['1', '2', '3', '4', '5']

map 과 lambda 함수

  • map 과 lambda 함수map(함수, 리스트) 여러 개의 데이터를 한번에 다른 형태로 변환하기 위해서 사용됩니다.
  • lambda 인자 :
  • >>> ls = ['1','2','3'] >>> list(map(int, ls)) >>> [1, 2, 3] >>> set(map(lambda x: x ** 2, range(5))) >>> {0, 1, 4, 9, 16}

어려웠던 점

총체적 난국 그 자체

1. 파이썬을 잘 모름

  • C++ 에 익숙해졌어서 수작업하는 편..(?) 인것같다..
  • 코테에 쓰이는 파이썬 함수나 라이브러리도 같이 익혀야 할 것 같다.
  • 함수 쓰면 금방 끝나는데 이건 또 언제 다 공부하고 외우지요

2. 자료구조 및 알고리즘 개념도 잘 모름

  • 물론 배웠던 것 같은데 까먹음
  • 정렬중에 어떤게 어느때에 사용되는지 모르겠다.
  • 정렬 자체를 정확하게 모른다.
728x90