본문 바로가기
공부/코딩테스트

프로그래머스/C# - 제일 작은 수 제거하기

by 잰쟁 2024. 6. 11.
728x90

 

 

문제 설명

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

 

 

제한 조건

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

 

 

입출력 예

 

 

풀이

 

1-1. 실패

using System;
using System.Collections.Generic;
public class Solution {
    public int[] solution(int[] arr) {
        List<int> num = new List<int>();
        Array.Sort(arr);
        Array.Reverse(arr);
        for(int i =0; i < arr.Length-1;i++){
            num.Add(arr[i]);
        }
        if(num.Count == 0){
            num.Add(-1);
        }
        int[] answer = num.ToArray();
        return answer;
    }
}

 

: 입출력 예가 저렇게 나와 있어서 정렬을 해야하는줄 알았다..

그래서 Array.Sort()로 오름차순 정렬을 한 후 Array.Reverse()로 내림차순으로 변경한 후 가장 마지막에 있는 배열을 제외한 나머지를 List에 넣어주고 다시 배열로 변경하는 방법으로 문제를 풀었는데,,,

 

예시 테스트는 모두 통과하였으나.. 마지막 제출 후 채점하기에서 전부 오류가 났다.....

 

.

.

.

 

오늘도 질문하기를 열심히 뒤져보던 중 천사님 발견!!!

오늘도 천사님 등장,,,

 

 

아하! 입력값이 모두 정렬되어져서 나오는 것도 아니고 내가 정렬을 해야하는 것도 아니구나!!

딱 가장 작은 값만 제외하여 반환해야하는 것이었다ㅎㅎ

 

그래서 다시 풀어본 결과~!!!


 

1-2. 최종 코드

using System.Linq;
using System.Collections.Generic;
public class Solution {
    public int[] solution(int[] arr) {
        List<int> num = new List<int>();
        for(int i =0; i<arr.Length; i++){
            num.Add(arr[i]);
        }
        num.Remove(arr.Min());
        if(num.Count == 0){
            num.Add(-1);
        }
        int[] answer = num.ToArray();
        return answer;
    }
}

 

: List를 하나 만들고 for문을 돌려가며 arr 배열에 있는 값들을 Add를 통해 List에 넣어준다.

거기서 값을 삭제하는 List 함수인 Remove()와 가장 작인 값을 반환하는 Array 함수인 Min()을 이용하여 가장 작은 값을 List에서 제외시켰다.

여기서 만약에 제외시키고 남은 List의 값 개수가 0이면 -1을 List에 넣어주었다.

그 후 다시 List --> Array로 변환시켜 주고 그 값을 반환하면 끝!!

 

휴우.. 오늘도 해결해서 다행이다!

 


 

다른 사람 풀이 )

using System;
using System.Linq;
public class Solution {
    public int[] solution(int[] arr) {
        int v = arr.Min();
        int[] answer = arr.Where(x => x != v).ToArray();
        if (answer.Count() == 0)
        {
            answer = new int[] { -1 };
        }
        return answer;
    }
}

 

: 제일 깔끔하다고 생각한 코드!

람다식을 이용하여 풀이를 하였다.

우선 Array 함수인 Min()을 통해 제일 작은 값을 찾아준 다음, 람다식을 이용해 arr 배열 중에 제일 작은 수가 아닌 수를 answer 배열로 담아주었다.

만약에 answer에 아무것도 없으면 -1 값을 가진 배열을 만들어 주고 반환하면 끝..

정말 깔끔하다 나도 다음에 람다식을 활용해봐야겠다!!