프로그래머스 파이썬 기초 트레이닝 :: 수열과 구간 쿼리 2 (list, sored *)

       

프로그래머스 URL

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



프로그래머스 코딩 카테고리 

코딩 기초 트레이닝

Day 6 조건문, 반복문 - 수열과 구간 쿼리 2 

Lv.0





문제 설명

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

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

각 쿼리의 순서에 맞게 답을 저장한 배열을 반환하는 solution 함수를 완성해 주세요.

단, 특정 쿼리의 답이 존재하지 않으면 -1을 저장합니다.



arr                 queries                         result
[0, 1, 2, 4, 3] [[0, 4, 2],[0, 3, 2],[0, 2, 2]] [3, 4, -1]




제한 사항

1 ≤ arr의 길이 ≤ 1,000

0 ≤ arr의 원소 ≤ 1,000,000

1 ≤ queries의 길이 ≤ 1,000

0 ≤ s ≤ e < arr의 길이

0 ≤ k ≤ 1,000,000




문제 이해

[입력] 정수 배열 arr / 2차원 정수배열 queries - 각원소는 [s, e, k] 

[출력] 정수 배열 answer  

1. queries 의 인덱스는 s, e, k 활용 가능

2. arr[]의 인덱스범위 = s부터 e까지 = arr[s:e+1

3. k 값과 arr[i] 값 대소 비교. 


배울 수 있는 점 : 2차원 배열 for문 원소, 리스트 슬라이싱, 정렬 활용 OR 임시배열과 min() 활용




------------------------




임시배열에 min() 활용한 방법   

압축하지 않은 풀 버전 
def solution(arr, queries):
    answer = []
    for s, e, k in queries:
        tmp = []
        for i in arr[s:e+1] :   
            if k < i : 
                tmp.append(i)
        if tmp :
            answer.append(min(tmp))
        else : 
            answer.append(-1)
    return answer 


압축 ver. 
def solution(arr, queries):
    answer = []
    for s, e, k in queries : 
        tmp = [i for i in arr[s:e+1] if k < i]
        answer.append(min(tmp) if tmp else -1) 
    return answer 



배열 정렬을 활용하는 방법    

def solution(arr, queries):
    answer = []
    for s, e, k in queries : 
        new = sorted(arr[s:e+1])
        for i in new :
            if k < i:
                answer.append(i) 
                break
            elif i == new[-1] : 
                answer.append(-1)
    return answer      




배운점

1. 리스트에 값 추가하는 for문 (리스트 컴프리헨션)  

for i in arr[s:e+1] :   
    if k < i : 
        tmp.append(i)   

append 메서드로 리스트에 값을 추가하는 for문을 한줄로 쓸때, 리스트 컴프리헨션을 사용하면 된다. 

 

tmp = [i for i in arr[s:e+1] if k < i] 

전체를 리스트로 감싸고 안에서 for문으로 값을 추가하는 것이기 때문에 append 메서드가 필요가 없다.

처음에 이를 모르고, 계속 list.append(i for i in arr[~] if ~ ) 이런식으로 append 메서드 안에서 for문을 사용했는데, 이는 오류를 발생한다. 

왜냐하면, append 메서드는 iterable을 받을 수 없고, 하나의 값만을 받아서 리스트에 넣는 역할이기 때문이다. 



2. sorted, sort 

리스트를 정렬하는 이 두개의 문법과 사용 차이가 계속 헷갈린다. 

sorted는 함수이고, sort는 메서드이다. 


2-1. sorted 함수

sorted 함수를 쓰면 기존의 함수를 오름차순/내림차순 정렬해서 새로운 리스트에 넣는다

new_list = sorted(iterable, key=key, reverse=True) 

    ② key (선택) : 기본값은 None, 순서를 결정하기 위해 실행할 함수

    ③ reverse (선택) : boolen 타입. 기본값은 False (오름차순), True 하면 내림차순 정렬 


2-2. sort 메서드

sort 메서드를 쓰면 새로운 리스트를 만들지 않고, 기존의 리스트 자체를 내림/오름차순 정렬한다

listsort.(key=key, reverse=reverse) 

    ① key (선택) : 기본값은 None, 순서를 결정하기 위해 실행할 함수

    ② reverse (선택) : boolen 타입. 기본값은 False (오름차순), True 하면 내림차순 정렬 





댓글

이 블로그의 인기 게시물

[KT 에이블스쿨 - IT 트랜드] 국내외 AI 관련 규제

KT 에이블스쿨 : IT 인프라 (1일차~5일차) 공부 정리

KT 에이블스쿨 : 핀테크 아이디어 공모전