Python study/Programmers Lv0

[Programmers] 수열과 구간 쿼리 2

김쿼드 2023. 7. 19. 21:57

문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.

각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.

각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

 

제한사항

  • 1 ≤ 1 ≤ arr의 길이 ≤ 1,000
    0 ≤ arr의 원소 ≤ 1,000,000
  • 1 ≤ queries의 길이 ≤ 1,000
    0 ≤ s ≤ e < arr의 길이
    0 ≤ k ≤ 1,000,000

 


문제 풀이

접근 전략

각 쿼리마다, 주어진 범위의 배열 원소를 스캔하며 조건에 맞는 원소를 찾아 반환하면 끝. 본인은 try-except 문을 사용해서 코드를 작성했음.

 

코드

def solution(arr, queries):
    answer = []
    
    for a,b,c in queries:
        try:
            temp = min([i for i in arr[a:b+1] if i > c])
        except ValueError:
            temp = -1
        answer.append(temp)
    
    return answer

 


결과 및 해석

위의 코드는 각 쿼리에 대해 배열의 해당 범위를 스캔하며 조건에 맞는 최소값을 찾음. 만약 조건에 맞는 원소가 없다면 except ValueError 하에 내려가서 -1을 반환하도록 함.

 

chatGPT 형님은 try-except를 사용하지 않고 min 함수의 default 파라미터를 이용하여 조건에 맞는 원소가 없을 때의 처리를 간결하게 표현함. 이로 인해 코드의 가독성이 한줄컷으로 완전 좋아짐.  리얼로 사기 아님? 

 

def solution(arr, queries):
    return [min((x for x in arr[s:e+1] if x > k), default=-1) for s, e, k in queries]