[C++] 벡터 요소 중 최대값/최소값 구하기 - algorithm 헤더

ryusuz·2021년 6월 13일
0

algorithm

목록 보기
1/3

프로그래머스 level 1의 '가장 작은 수 제거하기' 문제를 해결할 때 썼던 헤더와 함수에 대해 소개하려고 한다.

이 함수를 알기 전에는 가장 작은 수 혹은 가장 큰 수를 구하기 위해 반복문을 사용해 벡터를 순회하며 모든 요소들을 비교해서 찾아냈다. (단순무식한 방법...😣)

#include <algorithm>

algorithm 헤더에 담긴 min_element 함수와 max_element 함수를 사용하면 단 한 줄로 최소값과 최대값, 그 값들의 인덱스 번호까지 구할 수 있다.

1. 최소값, 인덱스 구하기

#include <algorithm>
#include <vector>

vector<int> v;

int min_idx = min_element(v.begin(), v.end()) - v.begin();
int min = *min_element(v.begin(), v.end());

min_element는 벡터의 위치를 반환하기 때문에, 최소값 자체를 구하려면 포인터를 사용해서 값에 접근한다.

인덱스는 리턴된 벡터의 위치에서 벡터의 시작위치를 빼서 구한다.

한 줄로 끝나는 최소값 구하기..!😲

2. 최대값, 인덱스 구하기

#include <algorithm>
#include <vector>

vector<int> v;

int max_idx = max_element(v.begin(), v.end()) - v.begin();
int max = *max_element(v.begin(), v.end());

최소값을 구한 것과 같은 방식으로 최대값을 구할 수 있다.

'가장 작은 수 제거하기' 문제 풀이

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> solution(vector<int> arr) {
    vector<int> answer;
    
    int idx = min_element(arr.begin(), arr.end()) - arr.begin();
    arr.erase(arr.begin() + idx);
    
    if (arr.empty()) arr.push_back(-1);
    
    return arr;
}

min_element 함수를 사용해서 최소값의 인덱스를 구한 다음, 벡터에서 해당 인덱스를 지워주었다.

문제에 비어있을 경우 {-1}을 리턴해야한다는 조건이 있었기 때문에 조건문을 걸어주었는데, 지금 생각해보니 'arr의 사이즈가 1이면' 이라는 조건으로 분기해줘도 괜찮을 것 같다.

이 방법으로 문제를 풀었더니 4점을 얻었다...!😳

더 좋은 방법이 있다면 공유 부탁합니다 .. 푸하하

profile
개발자

2개의 댓글

comment-user-thumbnail
2021년 9월 24일

#include <bits/stdc++.h>
using namespace std;

vector solution(vector arr) {
arr.erase(min_element(arr.begin(), arr.end()));
return arr.empty() ? vector{ -1 } : arr;
}
// min_element 잘 알아갑니다. 저는 이렇게...

1개의 답글