https://school.programmers.co.kr/learn/courses/30/lessons/42748
✳️ 코드 작성
🤔 코드 아이디어
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]
'📒 Today I Learn > 🐍 Python' 카테고리의 다른 글
[Python] 가장 가까운 같은 글자 (0) | 2024.09.25 |
---|---|
[Python] 두 개 뽑아서 더하기 (0) | 2024.09.20 |
[Python] 문자열 내 마음대로 정렬하기 (0) | 2024.09.13 |
[Python] 숫자 문자열과 영단어 (딕셔너리 이용) (0) | 2024.09.12 |
[Python] 시저 암호 (chr, ord) (0) | 2024.09.11 |