[Python]_코딩테스트_제일 작은 수 제거하기

김희정·2024년 1월 26일
0

코딩테스트

목록 보기
5/13

[프로그래머스] 제일 작은 수 제거하기

Problem

문제설명

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

제한조건

  • arr은 길이 1 이상인 배열입니다.
  • 인덱스 i, j에 대해 i ≠ j이면 arr[i] ≠ arr[j] 입니다.

입출력 예

arrreturn
[4,3,2,1][4,3,2]
[10][-1]

Solution

1. 첫 시도 = 오답

def solution(arr):
    answer = []
    if len(arr) == 1:
        answer.append(-1)
        return answer
    else:
        for i in arr:
            answer.append(i)
            answer.sort(reverse=True)
        return answer[:-1]

코드 실행시 나오는 테스트 두개는 통과했는데,
채점을 누르니 다 틀렸다고 나온다 🥲

vsc에서 테스트 해본 결과
출력은 원하는대로 잘 나오는 것 같은데,, 왜 오답으로 나올까???

추가

  • 문제를 다시 읽어보니, 내림차순으로 정렬할 필요가 없었다.
  • 주어진 테스트 케이스는 우연히도 [4,3,2,1] 내림차순으로 정렬되어있지만
    만약 주어진 값이 [5,7,1,8,2,3] 이라면 여기서 원하는 정답은 [5,7,8,2,3] 일 것이다.
    [8,7,5,3,2] 가 아니라
  • 따라서 내림차순으로 정렬 후 가장 작은수를 제외하기위해 마지막 숫자를 슬라이싱해서 가져올 것이 아니라, min함수를 이용하는 것이 맞다!!..

2. 수정 코드

def solution(arr):
    if len(arr) == 1:
        return [-1]
    else:
        min_value = min(arr)
        arr.remove(min_value)
        return arr

코드 회고

  • len(arr) == 1 의 경우 굳이
if len(arr) == 1:
        answer.append(-1)
        return answer

answer에 -1을 넣고 다시 answer을 리턴해줄 필요 없이 아래와 같이 하면 된다.

if len(arr) == 1:
        return [-1]
  • len(arr) > 1 의 경우
(수정 전)
for i in arr:
	answer.append(i)
    answer.sort(reverse=True)
    return answer[:-1]

(수정 후)
min_value = min(arr)
arr.remove(min_value)
return arr
  • 내림차순으로 정렬해서 마지막수를 제외하고 가져올 필요 없이,
    min_value 함수를 새로 파서, 최솟값을 remove 해서 리턴해오면 된다.
profile
데이터 애널리스트가 되고 싶은

0개의 댓글