(Lv.1) 고득점 키트_K번째수

duo2208·2022년 6월 25일
0

Algorithm

목록 보기
3/5
post-thumbnail

Link : 프로그래머스 > 고득점 키트 > K번째수
Language : Python3
평균 점수 : 높음


Keyward

💡 정렬


Solution

단순 구현 문제이다. 배열을 파싱할 수 있느냐를 묻고 있다.


나의 코드

채점 : 1024(+5)

  1. commands 2차원 배열을 반복문을 사용하여 1차원 배열에 따로 저장.
  2. tmp 에 i번째부터 j번째까지 배열을 복사.
  3. sort() 함수로 써서 정렬.
  4. k번째 수를 찾아서 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]

Note

1. lambda 함수

아무래도 pythonic 한 코드라고 하면 lambda 함수는 빠질 수 없는 이야기다. 제대로 복습을 하고 지나가야 할 필요성을 느꼈다.

  • 결과 부분을 return 키워드 없이 자동으로 return 해준다.
  • 익명함수라는 이름처럼 함수의 이름을 지정하지 않는다.
  • 재사용할 이유가 없다면 lamda 함수를 생성하는 것이 낫다.

문자열을 앞뒤 불필요한 공백을 제외한 문자의 길이로 정렬을 하고 싶다고 가정한 예시를 보자.

# 일반 함수
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())))

2. map 함수

다른 형태로 데이터를 변환할 때 map 내장 함수를 사용한다. 문자열 list 를 int형 리스트로 변환할 때 특히 많이 사용된다. 그 외에도 기존 list의 원소들을 모두 제곱할 때나 원하는 형태로 바꾸고 싶을 때 유용하다.

map(function, iterable)

  • 첫번째 매개 변수로 함수가 오고,
  • 2번째 매개 변수로 반복 가능한 자료형(리스트, 튜플)을 입력받는다.
  • 원본 리스트를 변경하지 않고, 새 리스트를 생성한다.
  • return 타입은 map object 이다. 이터레이터 이므로 변수 여러 개에 저장하는 언패킹이 가능하다. 결과를 리스트나 튜플 타입으로 바꿔서 저장하도록 하자.
def two_times(x):
	return x*2

list(map(two_times, [1, 2, 3, 4])	# output : [2, 4, 6, 8]

📌 참고

0개의 댓글