알고리즘 코드카타

주어진 int형 배열에서 제일 작은 수를 제거하고 남은 요소들을 반환하는문제이다.
문제풀이
algorithm 라이브러리에 sort 함수가 존재한다 sort 함수는 기본적으로 벡터에 사용이 가능하고 sort 함수를 적용할 경우 오름차순으로 정렬된다. 세번째 인자로 비교함수를 전달할경우 내림차순 정렬또한 가능하다. 문제에서 제일 작은 수를 제거한다라는 조건이 주어졌으니 sort함수 내림차순을 통해 정렬 후 마지막 요소를 제거한 후 반환하면 될것이다. 오름차순 후 맨 앞요소를 제거할경우 모든벡터들이 앞으로 당겨지는 비효율적인 계산이 일어날 수 있다고 생각.
코드구현
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr) {
vector<int> answer;
sort(arr.begin(), arr.end(), [](int a, int b) {
return a > b;
});
arr.pop_back();
if(arr.empty())
{
arr.push_back(-1);
}
answer = arr;
return answer;
}
테스트결과

체점결과

문제원인파악
테스트 작동상 문제 없었으며, 코드를 살펴봤을때 문제가 없다고 생각했으나, 채점결과 단 하나의 테스트케이스도 통과를 하지 못했다는점이 의문이었다. 보통 테스트케이스 1개도 통과하지 못했다는것은 어떠한 값을넣어도 의도한 바로 출력되지 않았다는것인데, 출제된 문제는 제대로 실행되었으니 쉽게 오류를 찾지 못하였다. 이후 도움을 통해 Sort 함수 같은 경우 어떠한 벡터가 주어진다고 하여도 순서가 정렬되어 버리니까 해당부분이 오류일것이라는 조언을 받았다. 이후 STL에 최솟값 자체를 찾아주는 함수 min_element, *min_element 라는것이 존재한다는 것 또한 조언을 받았다. min_element와 *min_element 의 차이는 *min_element 의 경우 벡터의 시작과 끝을 인자로 받으며 찾은 요소의 주소를 반환한다 (요소의 값을 알 수 있음.) 반면에, min_element 의 경우 ((벡터의 시작, 벡터의끝) - 벡터의 시작) 의 형태로 인자값을 받으며 찾은 요소의 인덱스를 반환해준다. 해당 인덱스를 찾은 후 벡터의 erase 함수를 통해 요소를 지우고 반환하면 해결이 될 것같다.
풀이과정수정
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr) {
vector<int> answer;
int min_index = min_element(arr.begin(), arr.end()) - arr.begin();
arr.erase(arr.begin() + min_index);
if(arr.empty())
{
arr.push_back(-1);
}
answer = arr;
return answer;
}
테스트결과

체점결과

느낀점
이번 문제 같은경우 벡터로 문제가 주어졌을때 요소의 위치가 바뀌면 안된다는것을 파악하지 못한것이 첫번째 문제이고, 두번째는 STL의 대한 지식이 부족한점이 문제였던것같다. 이후 오답을 파악한 후 힌트를 얻어 빠른시간내에 해결하긴했지만, STL의 지식에 대한 부족함을 많이 느꼈고, 코드카타에서 요구하는 정답이 생각보다 유연하지 않다는 사실을 알게되었다.