본문 바로가기

TIL

[240327] 파이썬: 코드카타 48 & SQL: 코드카타 166

[파이썬 코드카타]

K번째수

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

 

1) 어떤 문제가 있었나

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하는 문제

 

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

commands = [[2, 5, 3], [4, 4, 1], [1, 7, 3]]  #각 리스트 속 원소가 i, j, k

result = [5, 6, 3]

 

2) 내가 시도해본 건 무엇인가

- command 원소의 길이는 3으로 고정인 점을 활용해 1차 for문으로 우선 slice list 생성

- 2차 for문에서 zip으로 slice list와 command의 마지막 반환 자릿수를 한 꺼번에 추출

- slice 값 정렬 후, 자리수에 맞는 숫자만 answer 리스트에 넣고 정답 반환 

 

3) 어떻게 해결했나

def solution(array, commands):
    
    slice_list = []
    answer = []

    for j in commands:
        slice_list.append(array[(j[0]-1):(j[1])])
        # [[5, 2, 6, 3], [6], [1, 5, 2, 6, 3, 7, 4]]
        
    for n, m in zip(slice_list, commands):
        answer.append(sorted(n)[(m[2]-1)])
    return answer

 

4) 무엇을 새롭게 알았나

- for 문으로 리스트를 꺼낸 뒤, 각 원소 자리수에 맞춰 변수를 지정해줄 수 있음!! (i,j,k = command)  

- list comprehension 꾸준히 연습이 필요할 듯

- x.sort()만 작성하면 none 반환되므로, 정렬 값을 보고싶다면 x를 출력해야 함
└ sorted(x)를 하면 x 변수에 지정을 따로 해줘야 하지만, 즉시 반환된 값 확인 가능   

# 다른 사람 풀이 01 
def solution(array, commands):
    answer = []
    for command in commands:
        i,j,k = command
        answer.append(list(sorted(array[i-1:j]))[k-1])
    return answer
    
# 다른 사람 풀이 02 
def solution(array, commands):
    return [sorted(array[a[0]-1:a[1]])[a[2]-1] for a in commands]