프로그래머스 파이썬 기초 트레이닝 :: 첫 번째로 나오는 음수 (next, filter 활용)
문제 설명
프로그래머스 URL
https://school.programmers.co.kr/learn/courses/30/lessons/181896
프로그래머스 코딩 카테고리
코딩 기초 트레이닝
Day 12 리스트(배열) - 첫 번째로 나오는 음수
Lv.0
문제 내용
정수 리스트 num_list가 주어질 때, 첫 번째로 나오는 음수의 인덱스를 return하도록 solution 함수를 완성해주세요. 음수가 없다면 -1을 return합니다.
num_list result
[12, 4, 15, 46, 38, -2, 15] 5
[13, 22, 53, 24, 15, 6] -1
-----------------------------------
기본 코드
def solution(num_list):
for i in range(len(num_list)):
if num_list[i] < 0 :
return i
return -1
2. enumerate() 로 범위 설정한 방식
def solution(num_list):
for i, v in enumerate(num_list) :
if v < 0 :
return i
return -1
한줄 코드 - 리스트 컴프리헨션
def solution(num_list):
return ([i for i in range(len(num_list)) if num_list[i] < 0] or [-1])[0]
2. enumerate() 로 범위 설정한 방식
def solution(num_list):
return ([i for i, v in enumerate(num_list) if v < 0] or [-1])[0]
리스트 컴프리헨션 방식으로 한줄 코드를 썼을때,
"끝에 [0]을 붙여서, 첫번째로 찾은 값은 리턴하겠다"를 뜻한다.
"만약에 찾는 값이 없다면, 리스트가 [-1]"이 되서 첫번째 인덱스인 -1이 리턴된다.
끝에 [0]을 붙이지않으면, 결과값이 [5] 혹은 [-1] 처럼 리스트형으로 출력이된다.
이 문제처럼 iterable (리스트, 튜플, 문자열 등)에서 원하는 첫번째 값만 검색하고자 할때는 next 함수를 사용할 수 있다.
next (iterable, default) 함수
1. iterable (필수) :
2. default (선택) : 반복 가능 객체의 마지막 요소 이후 반환할 기본값.
next(my_string, len(my_string) 이렇게 쓴다면
"my_string 문자열을 다 순환한 이후에도 값이 없으면, 문자열의 길이를 반환"
def solution(num_list):
return next((i for i in range(len(num_list)) if num_list[i] < 0 ), -1)
def solution(num_list):
return next((i for i, v in enumerate(num_list) if v < 0), -1)
iterable 객체가 가지고 있는 __next__ 메서드를 활용한 함수이다.
리스트를 for문 돌렸을때, 순차적으로 다음, 다음,,,, 끝까지 도는것 또한 __next__메서드를 통해 그렇게 동작하는 것이다.
그래서 next 함수는 iterable 객체에서 다음 값을 가져오는 역할을 한다.
조건을 만족하는 첫 번째 값을 찾는 용도로 활용된다.
1개의 값을 찾으면 바로 리턴하고, 찾고자하는 값이 없으면 에러가 발생한다.
이 에러를 방지하기 위해서, 두번째 매개변수인 default 값을 넣어야한다. (선택이지만 필수)
조건에 만족하는 하나의 값을 삽입이나, 삭제, 수정할 때는 next 함수는 적절하지 못하다.
조건에 맞는 첫 번째 값을 찾는 검색에 가까운 역할을 수행한다.
next 함수 장점은 효율적으로 반복을 수행한다는 것이다.
이 문제에서 next 함수를 쓰면 첫 번째 음수를 찾을 때까지만 반복을 수행한다.
만약 일반적인 for문을 사용한다면 모든 원소를 확인한 후에야 결과를 알 수 있으므로 불필요한 반복이 발생할 수도 있지만,
next 함수를 써서 값을 중간에 찾으면 즉시 종료되기 때문에 성능 상 이점있음
-----------------------------------
filter (function, iterable) 함수
def solution(num_list):
answer = -1
a = list(filter(lambda x : x<0 , num_list))
if(len(a)>0):
answer = num_list.index(a[0])
return answer
if문 대신, filter 함수를 써서 코드를 써도된다.
filter를 쓰면 리턴 값이 iterator 이기 때문에 list 형변환을 해줘야한다.
-----------------------------------
filter 추가 문제
D-18 문자열 잘라서 정렬하기
[문제설명]
문자열 myString이 주어집니다.
"x"를 기준으로 해당 문자열을 잘라내 배열을 만든 후
사전순으로 정렬한 배열을 return 하는 solution 함수를 완성해 주세요.
def solution(myString):
answer = []
my = sorted(myString.split('x'))
for i in my :
if i :
answer.append(i)
return answer
def solution(myString):
return [i for i in sorted(myString.split('x')) if i ]
압축버전을 보면, if i로 i가 참일때만 리스트에 저장하는 것을 볼 수 있다.
if문을 쓰지 않고, filter를 사용해서 i가 참일때만 저장하는걸로 바꿀 수 있다.
def solution(myString):
return sorted(filter(lambda i : i !="", myString.split('x')))
댓글
댓글 쓰기