python의 list는 string처럼 indexing, slicing이 가능하다
L = [1, 2.2, 'python'] # int, float, str 모두 저장 가능
l1 = list() # empty list
l2 = [] # empty list
letters = ['A', 'B', 'C', 'D', 'E', 'F']
n = len(letters) # n = 6
last_letter = letters[-1] # 마지막 원소 접근 방법
list L에 대하여 L[b:e:s]로 slicing이 가능하다
b = begin, e = end, s = step
s > 0일 때, b < e이어야 하고 s < 0일 때 b > e이어야 한다
(그렇지 않으면 빈 list를 생성한다)
a = [0, 1, 2, 3, 4, 5, 6, 7, 8]
print(a[1:7:2]) # [1, 3, 5]
print(a[::-1]) # [8, 7, 6, 5, 4, 3, 2, 1, 0]
print(a[::-4]) # [8, 4, 0]
자주 사용되는 메소드는 다음과 같다.
# L은 list, x는 임의의 객체
# 추가
L.append(x) # x를 L의 끝에 추가
L.extend(L2) # 리스트 L2의 모든 원소를 L1에 추가
# 삭제
L.pop() # 마지막 원소 제거 및 반환
L.pop(x) # L[x]를 제거하고 그 값을 반환
L.clear() # L을 빈 리스트로 만듦
L.remove(x) # 처음으로 값이 x인 데이터 제거, 반환X
# 정렬
L.sort() # L을 오름차순으로 정렬
L.sort(reverse=True) # L을 내림차순으로 정렬
예제 K번째 수
indexing, slicing을 이해하고 있다면 충분히 쉽게 풀 수 있다.
예제의 commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]의 경우
commands[0] = [2, 5, 3]
commands[1] = [4, 4, 1]
commands[2] = [1, 7, 3]
이므로
commands[0][0] = 2
commands[0][1] = 5
commands[0][2] = 3
이 된다.
def solution(array, commands):
answer = []
for L in commands:
# commands를 하나씩 뽑아서 생각하기
b = L[0] - 1 # begin index
e = L[1] # end index
t = L[2] - 1 # target index
tmp = array[b:e] # tmp는 정렬하기 전 리스트
tmp.sort() # 정렬
answer.append(tmp[t]) # 정답을 저장
return answer
array의 길이를 n, commands의 길이를 m이라 하면, for 에서 O(m)이고, for 내부에서 sort는 O(nlogn)이므로 solution의 시간복잡도는 O(mnlogn)이다. 그러나 문제에서 n은 100이하, m은 50이하이므로 크게 문제가 되지 않는다.