Code KATA/알고리즘 코드카타

[2024.12.30] 제일 작은 수 제거하기

iiblueblue 2024. 12. 30. 09:29

문제 설명

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

 

 

제한사항

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

 

 

입출력 예

arr return
[4, 3, 2, 1] [4, 3, 2]
[10] [-1]

 

 

문제 풀이

풀이 언어 : C++

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> arr) {
    vector<int> answer;
    
    if(arr.size()==1) // arr의 길이가 1이라면
    {
        answer.push_back(-1); // -1을 채워 리턴
    }
    else
    {
        answer=arr;
        
        // 최소값 찾기
        int min_index=0; // 최소값 인덱스 
        for(int i=1; i<arr.size(); i++)
        {
            if(arr[min_index]>arr[i]) // min index 번째 수보다 i번째 수가 더 작다면
            {
                min_index=i; // 최소값 인덱스 업데이트
            }
        }
        
        // 최소값 삭제
        answer.erase(answer.begin()+min_index);
    }
    
    return answer;
}

일단 쉽게 끝낼 수 있는 것 부터 끝내 보도록 하자. 빈 배열을 반환해야 하는 경우는 배열의 크기가 1일 때가 유일하다. 따라서 배열의 크기가 1인 경우 먼저 -1을 채워 리턴해주도록 한다.

 

만약 배열의 길이가 1이 아니라면 최소값을 찾아 그 값을 배열에서 지우고 리턴하면 된다. 먼저 min_index를 선언하고 0으로 초기화하여 최소값의 인덱스를 담을 정수형 변수를 선언해준다. 그리고 반복문을 돌리면서 최소값이 들어있는 인덱스를 찾는다. min_index번째 숫자와 i번째 숫자를 비교하면서 더 작은 수가 나오면 min_index를 업데이트하는 방식이다.

마지막으로 answer에서 erase 함수를 이용해 min_index 번째 숫자만 지워주고 정답을 리턴하면 된다.

 

 

참고사항

v.erase(iterator itr)은 itr 위치에 있는 수를 지워주는 함수이다. 매개변수가 iterator 형이기 때문에 삭제할 인덱스를 정해줄 때 v.begin()에 원하는 인덱스만큼 + 해주면 된다.

vector<int> v;
...
v.erase(v.begin+3); // 3번째 인덱스에 있는 값 삭제

 

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/12935

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr