본문 바로가기
Programming Practice/Python

프로그래머스 <수열과 구간 쿼리 2> Python

by TAMIK 2025. 4. 18.
728x90

Programmers <수열과 구간 쿼리 2> 문제

문제 설명

정수 배열 arr와 2차원 정수 배열 queries이 주어집니다. queries의 원소는 각각 하나의 query를 나타내며, [s, e, k] 꼴입니다.
각 query마다 순서대로 s ≤ i ≤ e인 모든 i에 대해 k보다 크면서 가장 작은 arr[i]를 찾습니다.
각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.
단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.

제한사항
1 ≤ arr의 길이 ≤ 1,000
    0 ≤ arr의 원소 ≤ 1,000,000
1 ≤ queries의 길이 ≤ 1,000
    0 ≤ s ≤ e < arr의 길이
    0 ≤ k ≤ 1,000,000

입출력 예
        arr                            queries                      result
[0, 1, 2, 4, 3]      [[0, 4, 2],[0, 3, 2],[0, 2, 2]]       [3, 4, -1]

def solution(arr, queries):
    answer = []	#빈 리스트 초기화
    for s, e, k in queries:	#queries 리스트를 순회하는 for 루프 시작
        tmp = []	#빈 리스트 초기화. k보다 큰 값 임시 저장에 사용.
        for i in range(s , e + 1):
            if arr[i] > k:
                tmp.append(arr[i])
        if tmp:	#tmp리스트가 비지 않았다면
            answer.append(min(tmp))
        else:
            answer.append(-1)
    return answer

queries는 [s, e, k]형태의 리스트로 이뤄진 리스트

 

arr의 특정 범위 s부터 e까지에서 k보다 큰 값들을 찾는 조건 정의.

 

for s, e, k in queries =>

s: 각 쿼리에서 탐색할 arr의 시작 인덱스

e: 각 쿼리에서 탐색할 arr의 끝 인덱스

k: 각 쿼리에서 비교할 기준 값. 문제에서는 arr의 해당 범위 내에서 k보다 큰 값들을 찾게 될 것.

 

for i in range(s, e +1) :  arr의 인덱스 순회. e까지 포함하기 위해 e+1. 여기서 i는 현재 접근 중인 arr의 인덱스.

if arr[i] > k : arr의 현재 인덱스 i의 값(arr[i])이 k보다 큰지 확인

tmp.append(arr[i])로 임시 저장. append(i)하면 절대 안 됨.

for루프를 돌고 있으므로 k보다 큰 모든 값이 tmp에 들어 간다.

 

if tmp: tmp가 비어 있는지 아닌지 확인. if tmp는 'tmp 리스트에 하나 이상의 요소가 있다면'을 의미.

빈 리스트는 논리적으로 False, 비어 있지 않은 리스트는 True

 

answer.append(min(tmp)) : tmp에 들어있는 값 중에 가장 작은 값을 answer리스트에 추가

 

if tmp가 false라면

answer.append(-1) : answer에 -1 추가

 

728x90