Computer Science/알고리즘 문제풀이

[codesignal][python] 10. Sort by Height

codesignal.com

 

Coding Tests and Assessments for Technical Hiring | CodeSignal

Learn how you can go beyond resumes in technical hiring with a state-of-the-art assessment platform and advanced coding tests

codesignal.com

level : easy

Question:

Some people are standing in a row in a park. There are trees between them which cannot be moved. Your task is to rearrange the people by their heights in a non-descending order without moving the trees. People can be very tall!

Example: 

For a = [-1, 150, 190, 170, -1, -1, 160, 180], the output should be
sortByHeight(a) = [-1, 150, 160, 170, -1, -1, 180, 190].

 

My answer:

def sortByHeight(a):
    f_a=list(filter(lambda x:x>0,a))
    f_a.sort()
    new_a=[]
    j=0
    for i in a:
        if i==-1:
            new_a.append(i)
        else:
            new_a.append(f_a[j])
            j+=1
    return new_a
  • -1이 아닌 요소만 뽑아서 list 만들고 정렬
  • 새로운 리스트에 원 리스트가 -1이면 복사하고 아니면 새로 정렬한 filter된 list에서 순서대로 복사

reference code:

def sortByHeight(a):

    l = sorted([i for i in a if i > 0])
    for n,i in enumerate(a):
        if i == -1:
            l.insert(n,i)
    return l
        
  • 비슷한 방법이지만 또 새로운 리스트를 생성해서 양쪽에서 복붙한게 아니라, 새로 필터링한 정렬 리스트에다가 -1 부분만 찾아서 insert
  • list.inset(위치, 요소) :  원하는 위치에 요소를 추가해주는데 기존에 요소들은 뒤로 밀려난다