코딩테스트/cpp
99클럽 코테 스터디 18일차 TIL C++ max_element
zyin
2024. 11. 17. 12:00
오늘의 학습 키워드
문제1: max_element 활용
문제 링크 - 프로그래머스 "모의고사"
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
공부한 내용 정리
(1) max vs max_element
C++에서는 최댓값을 구할 때 std::max
와 std::max_element
를 상황에 맞게 선택해서 사용할 수 있습니다. 두 함수는 비슷한 목적을 가지고 있지만, 활용 방식과 반환값에서 차이가 있습니다.
항목 | std::max |
std::max_element |
---|---|---|
기능 | 두 값 또는 세 값 중 최댓값 반환 | 컨테이너 내에서 최댓값을 가진 요소의 반복자 반환 |
입력값 | 두 값, 세 값, 또는 초기화된 값들 | 반복자 범위(begin, end) |
반환값 | 최댓값 자체를 반환 | 최댓값을 가진 반복자(iterator)를 반환 |
사용 조건 | 비교 대상이 명확한 경우 | 컨테이너에서 최댓값을 찾는 경우 |
커스텀 비교 함수 | 가능 | 가능 |
std::max의 사용 예시
std::max
은 두 값 또는 세 값 중 최댓값을 반환하는 함수입니다. 컨테이너보다는 특정 값의 비교에 주로 사용됩니다.
#include <algorithm>
#include <iostream>
int main() {
int a = 10, b = 20, c = 15;
// 두 값 비교
int max_value = std::max(a, b);
std::cout << "두 값의 최댓값: " << max_value << std::endl;
// 세 값 비교
max_value = std::max({a, b, c}); // 초기화 리스트를 사용
std::cout << "세 값의 최댓값: " << max_value << std::endl;
return 0;
}
std::max_element의 사용 예시
std::max_element
는 컨테이너의 요소 중 최댓값을 가진 위치를 반환합니다. 반복자(iterator)를 반환하므로 최댓값 자체를 얻으려면 *
를 사용해야 합니다.
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {10, 20, 15, 30, 25};
// 최댓값의 위치
auto max_iter = std::max_element(vec.begin(), vec.end());
std::cout << "최댓값: " << *max_iter << std::endl;
std::cout << "최댓값의 인덱스: " << std::distance(vec.begin(), max_iter) << std::endl;
// 커스텀 비교 함수: 절댓값 기준으로 비교
max_iter = std::max_element(vec.begin(), vec.end(), [](int a, int b) {
return std::abs(a) < std::abs(b);
});
std::cout << "절댓값 기준 최댓값: " << *max_iter << std::endl;
return 0;
}
(2) 전체 풀이
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> answers) {
vector<int> vecScore = {0, 0, 0};
vector<vector<int>> vecPatterns= {\
{1, 2, 3, 4, 5},\
{2, 1, 2, 3, 2, 4, 2, 5},\
{3, 3, 1, 1, 2, 2, 4, 4, 5, 5}\
};
for (int i=0;i<answers.size();i++){
const auto &ans = answers[i];
int it, psize;
vector<int> pattern;
for (int j=0;j<vecPatterns.size();j++){
pattern = vecPatterns[j];
psize = pattern.size();
it = pattern[i%psize];
if (it==ans) vecScore[j]++;
}
}
vector<int> answer;
int maxScore = *max_element(vecScore.begin(), vecScore.end());
for (int i=0;i<vecScore.size();i++){
if (maxScore == vecScore[i]) answer.push_back(i+1);
}
return answer;
}
회고
이번 학습을 통해 std::max
와 std::max_element
의 차이를 명확히 이해할 수 있었습니다. 특히 std::max_element
의 커스텀 비교 함수는 단순한 숫자 비교 이상의 상황에서도 강력한 도구임을 느꼈습니다.