📒 Today I Learn/🐍 Python

[Python] k번째 수

se0ehe 2024. 9. 19. 12:07

 

 

 

 

 

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/42748

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

✳️ 코드 작성

🤔 코드 아이디어
1. commands 를 순회하면서 i, j, k에 대해 정의
2. array를 슬라이싱해서 변수에 저장
3.  변수를 정렬
4. 정렬된 변수에서 k번째 숫자를 빈리스트에 추가

 

💟 코드 풀이

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

 

 

🟣 for문

  • commands는 2차원 배열로 for문 순회가 가능하다.
  • commands 리스트에서 내부 리스트를 하나씩 가져온다.

 

🟣 i, j, k 변수

  • 내부 리스트인 command에서 첫 번째, 두 번째, 세 번째 값을 변수 i, j, k 에 할당

 

🟣 slice

  • 주어진 array를 지정한 변수를 이용하여 슬라이싱 → i-1부터 j까지
    • i-1인 이유 : 0번째 부터 카운팅하는 파이썬 특성상 -1을 해줘야 우리가 아는 통상적인 1번째부터 슬라이싱을 할 수 있게 됨
  • slice한 리스트를 slice라는 변수에 저장

 

🟣 sort

  • 슬라이싱된 리스트형태인 slice 변수를 오름차순으로 정렬

 

🟣 append

  • 빈리스트에 k번째 숫자를 추가
    • k-1을 한 이유도 i-1과 동일하게 작용

 

 

💟 리스트 컴프리헨션 이용

  • 동일하게 작동하는 원리이지만 보다 간결하게 작성할 수 있음!
def solution(array, commands):
    return [sorted(array[i-1:j])[k-1] for i, j, k in commands]

 

 

🔖 i-1?, k-1? 근데 k는..?

라고 생각할 수 있는 부분을 정리하자면, 결국 -1을 해주는 이유는 파이썬의 인덱스 시스템과 관련이 있다!

이 문제에서 요구하는 것이 일반적으로 1부터 시작하는 방식을 말하고 있지만 파이썬은 0부터 시작하기 때문에 인덱스를 맞추는 조정이 필요하다!

 

💭 i-1, k-1을 하는 이유

  • 문제에서 i는 1부터 시작하는 인덱스를 의미하지만, 파이썬의 리스트 인덱스는 0부터 시작
  • 예를 들어, array[2]는 문제에서 i=2일 때 두 번째 요소를 의미하지만, 파이썬에서는 두 번째 요소의 인덱스가 1이므로 array[2-1]이 필요
  • 즉, i-1은 1부터 시작하는 인덱스를 0부터 시작하는 인덱스로 맞추기 위한 조정
  • k는 정렬된 배열에서 k번째 요소를 의미하는데 역시 1부터 시작하는 인덱스를 이용해야 함
  • 그러나 이 경우에도 파이썬 인덱스를 따르기 때문에 k번째 요소를 가져오기 위해서는 k-1로 조정이 필요

 

💭 j에는 -1을 하지 않는 이유

  • j는 슬라이싱에서 사용, 파이썬의 리스트 슬라이싱은 끝 인덱스를 포함하지 않는 특성이 있음
  • array[i-1:j]라고 쓰면 i-1부터 j-1까지 자르는 것이 아니라, i-1부터 j 직전까지 자름
  • 문제에서 요구하는 범위가 i부터 j까지라면, 파이썬 슬라이싱에서 j를 그대로 사용해도 j번째 값이 포함되기 때문에 추가 조정이 필요 없음

 

🪄 요약

  • i-1 : 1부터 시작하는 인덱스를 파이썬의 0부터 시작하는 인덱스와 맞추기 위해 사용
  • j : 파이썬 슬라이싱에서 끝 인덱스는 자동으로 포함되지 않기 때문에 조정이 필요 없음
  • k-1 : 1부터 시작하는 인덱스를 파이썬의 0부터 시작하는 인덱스로 맞추기 위해 사용

 

 

 

💠 예시

array = [1, 5, 2, 6, 3, 7, 4]
commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]

result = solution(array, commands)
print(result)

 

🔵 동작 과정

1️⃣ 첫 번째 command = [2, 5, 3]

 

  • i = 2, j = 5, k = 3
  • 배열 array[2-1:5]를 자르면 [5, 2, 6, 3]가 됨
  • 이를 정렬하면 [2, 3, 5, 6]
  • 정렬된 배열에서 세 번째 숫자는 5, 따라서 answer에 5를 추가

 

2️⃣ 두 번째 command = [4, 4, 1]

  • i = 4, j = 4, k = 1
  • 배열 array[4-1:4]를 자르면 [6]이 됨
  • 이미 한 개의 숫자라 정렬할 필요 없음
  • 첫 번째 숫자는 6, 따라서 answer에 6을 추가

 

3️⃣ 세 번째 command = [1, 7, 3]

  • i = 1, j = 7, k = 3
  • 배열 array[1-1:7]을 자르면 [1, 5, 2, 6, 3, 7, 4]가 됨
  • 이를 정렬하면 [1, 2, 3, 4, 5, 6, 7]
  • 정렬된 배열에서 세 번째 숫자는 3, 따라서 answer에 3을 추가

 

🔵 최종 결과

answer = [5, 6, 3]