기록

99클럽 코테 스터디 18일차 TIL C++ max_element 본문

코딩테스트/cpp

99클럽 코테 스터디 18일차 TIL C++ max_element

youngyin 2024. 11. 17. 12:00

오늘의 학습 키워드

문제1: max_element 활용
문제 링크 - 프로그래머스 "모의고사"

 

프로그래머스

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

programmers.co.kr

 

공부한 내용 정리

(1) max vs max_element

 

C++에서는 최댓값을 구할 때 std::maxstd::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::maxstd::max_element의 차이를 명확히 이해할 수 있었습니다. 특히 std::max_element의 커스텀 비교 함수는 단순한 숫자 비교 이상의 상황에서도 강력한 도구임을 느꼈습니다.

Comments