알고리즘

[프로그래머스 알고리즘 고득점 KIT] 정렬 : K번째 수

enayoiii 2025. 4. 23. 18:55

프로그래머스 문제 보러가기

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

  • 배열 array 주어졌을 떄, i번째 숫자부터 j번째 숫자까지 자른 후, 자른 배열에서 k번째 수를 구함
  • [i,j,k]는 2차원 배열인 commands의 원소로 주어짐 (ex : commands = [[i1,j1,k1], [i2,j2,k2]])
  • 구한 k번째 수를 정답 배열에 넣어 반환

내 코드

def solution(array, commands):
    answer = []
    li1 = []
    for x in range(len(commands)):
        i = commands[x][0]
        j = commands[x][1]
        k = commands[x][2]
        li1 = array[i-1:j]
        li1 = sorted(li1)
        ans = li1[k-1]
        answer.append(ans)
    return answer

코드 풀이

  1. commands를 for문으로 순회 : commands[x]를 이용해 2차원 배열에서 [i,j,k]로 이뤄진 1차원 리스트 추출
  2. 추출한 1차원 리스트에서 i, j, k원소 뽑아내기
  3. i,j로 array 리스트 슬라이싱 - 여기서 'n번째'는 0부터 시작하는 리스트의 인덱스 수와 1이 차이나니 주의
  4. k번째 요소도 위와 마찬가지로, 인덱스 수와 1이 차이남 (ex: [A,B,C,D]에서 3번째는 C이고, C의 인덱스는 2)
  5. 이를 정답 배열에 append

다른사람 효율적인 풀이

  • lambda, map 함수 사용
  • commands의 원소 x에서 바로 x[0], x[1], x[2]로 i, j, k를 지정해 array 슬라이싱
  • list로 묶어 반환

lambda - map함수 예시 

map(lambda 매개변수: 반환값, iterable)

 

iterable - 문자열, 리스트, 튜플, range와 같은 순회 가능한 값

 

즉, 실제 사례를 살펴보면 다음과 같다.

list(map(lambda x: <x를 이용한 연산>, <반복 가능한 자료>))
nums = [1, 2, 3, 4]
doubled = list(map(lambda x: x * 2, nums))
print(doubled)  # 출력: [2, 4, 6, 8]

 

let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });