NIRVANA

[level 1] 제일 작은 수 제거하기(성공) 본문

Coding test(Python3)/Programmers

[level 1] 제일 작은 수 제거하기(성공)

녜잉 2023. 7. 12. 19:40

문제 

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

 

문제 풀이 접근법 1

1) 리스트 arr의 길이가 1보다 큰지 확인한 뒤, 1보다 작다면 answer에 -1을 추가한다.

2) 반복문에서 원소를 비교하며 min값을 찾는다. 

3) 찾은 min값을 remove()를 사용하여 제거한다

4) answer리스트를 반환한다. 

def solution(arr):
    answer = []
    min = 100
    
    if len(arr) <=1:
        answer.append(-1)
    
    else:
        for i in arr:
            if i < min:
                min = i
            
        arr.remove(min)
        answer = list(arr)
        
    return answer

...실패했다 ^~^

 

 

문제 접근법2

1) 리스트 arr의 길이가 1보다 큰지 확인한 뒤, 1보다 작다면 answer에 -1을 추가한다.

2) 반복문에서 원소를 비교하며 min값을 찾는다. 

3) list comprehension을 통해 arr리스트에서 min값이 아닌 것들로 다시 리스트를 재생성한다.

4) answer 리스트를 반환한다. 

def solution(arr):
    answer = []
    min = 100
    
    if len(arr) <= 1:
        answer.append(-1)
    
    else:
        for i in arr:
            if i < min:
                min = i
        answer = list([ i for i in arr if i != min])
        
    return answer

역시나 실패했다...

위의 코드는 min값이 여러개일 경우(중복될 경우) 제거하지 못한다는 단점이 있었지만

해당 코드는 vscode상에서는 내림/오름차순 여부와 상관없이, 중복 여부와 상관없이 잘 제거되었는데

여전히 테스트 13번, 15번에서 실패했다...

좀 더 고민해봐야지 

 

 


 

문제 접근법3(성공!!)

반례를 생각하지 못하고 있었는데 101, 102가 arr에 들어올 경우 

min값이 100으로 되어 있으므로 101이 리스트에서 제거되지 않고 그대로 있게 되었다. 

그래서 min값을 임의로 설정하지 않고 리스트의 첫값으로 바꿔주었다. 

def solution(arr):
    answer = []
   
    
    if len(arr) <= 1:
        answer.append(-1)
    
    else:
        min = arr[0]
        for i in arr:
            if i < min:
                min = i
        answer = list([ i for i in arr if i != min])
        
    return answer


처음에는 remove 사용해서 오류가 난건가? 싶어서 list comprehension으로 바꾼거였는데

remove()함수를 사용해도 될 것 같다~!