Link : 프로그래머스 > 고득점 키트 > K번째수
Language : Python3
평균 점수 : 높음
💡 정렬
단순 구현 문제이다. 배열을 파싱할 수 있느냐를 묻고 있다.
채점 : 1024(+5)
commands
2차원 배열을 반복문을 사용하여 1차원 배열에 따로 저장.tmp
에 i번째부터 j번째까지 배열을 복사.sort()
함수로 써서 정렬.answer
배열에 저장.def solution(array, commands):
answer = []
for command in commands:
tmp = array[i[0]-1:i[1]]
tmp.sort()
answer.append(tmp[i[2]-1])
return answer
⑴ map
함수와 과 lambda
함수 사용 ›› better
보다 pythonic 한 코드이다.
map 함수를 사용함으로써 2차원 배열을 1차원배열로 따로 저장하는 for문이 필요 없어졌다.
def solution(array, commands):
return list(map(lambda x:sorted(array[x[0]-1:x[1]])[x[2]-1], commands))
⑵ inline for loop 로 한줄 압축하기
내가 쓴 코드도 한 줄로 압축이 가능하다.
for i, j, k in commands:
로 축약하니 가독성이 더 좋아진다.
다만 list.sort()
가 아닌 sorted()
함수를 사용해야 한다
def solution(array, commands):
return [sorted(array[i-1:j])[k-1] for i,j,k in commands]
lambda
함수아무래도 pythonic 한 코드라고 하면 lambda 함수는 빠질 수 없는 이야기다. 제대로 복습을 하고 지나가야 할 필요성을 느꼈다.
return
키워드 없이 자동으로 return
해준다.문자열을 앞뒤 불필요한 공백을 제외한 문자의 길이로 정렬을 하고 싶다고 가정한 예시를 보자.
# 일반 함수
def my_key(string):
return len(string.strip())
target = [' cat ', ' tiger ', ' dog', 'snake ']
print(sorted(target, key=my_key))
# 람다 함수
target = [' cat ', ' tiger ', ' dog', 'snake ']
print(sorted(target, key=lambda x : len(x.strip())))
map
함수다른 형태로 데이터를 변환할 때 map
내장 함수를 사용한다. 문자열 list 를 int형 리스트로 변환할 때 특히 많이 사용된다. 그 외에도 기존 list의 원소들을 모두 제곱할 때나 원하는 형태로 바꾸고 싶을 때 유용하다.
map(function, iterable)
return
타입은 map object
이다. 이터레이터 이므로 변수 여러 개에 저장하는 언패킹이 가능하다. 결과를 리스트나 튜플 타입으로 바꿔서 저장하도록 하자.def two_times(x):
return x*2
list(map(two_times, [1, 2, 3, 4]) # output : [2, 4, 6, 8]