본문 바로가기
Study (etc)/Problem Solving

[BOJ / C++] 26091번 : 현대모비스 소프트웨어 아카데미

by Haren 2023. 5. 25.

문제

 

현대모비스는 글로벌 자동차 부품 기업으로 자율주행, 커넥티비티, 전동화 분야에 역량을 집중해 스마트 모빌리티 시대를 선도하고 있는 기업입니다.

현대모비스는 소프트웨어 생태계 조성을 위해 소프트웨어 아카데미를 운영하고 있으며, 내부적으로는 연구원들의 소프트웨어 직무교육 이수를 통해 우수인재를 육성하고, 대외적으로는 채용 연계형 프로그램을 운영하여 취업 준비생들에게 소프트웨어 전문 교육을 무상으로 제공하고, 더 나아가 우수 이수자들을 채용하고 있습니다.

현대모비스에서 소프트웨어 아카데미 견학생을 모집한다고 한다. 이번 견학 활동은 모두 팀 단위로 진행되며 아래 두 조건을 모두 만족하는 팀만 소프트웨어 아카데미를 견학할 수 있다.

  • 팀원이 두 명이다.
  • 팀의 능력치가 이상이다. 팀의 능력치는 모든 팀원의 능력치를 합한 값이다.

Sogang ICPC Team 학회원 명이 견학을 희망한다. 학회장 동건이는 명으로 최대한 많은 팀을 만들어 견학을 보내고 싶다. 동건이가 최대 몇 팀이나 견학 보낼 수 있을지 구해보자.

입력

첫째 줄에 견학을 희망하는 학회원의 수 과 견학하는 팀의 최소 능력치를 나타내는 정수 이 공백으로 구분되어 주어진다.

둘째 줄에 학회원 명의 능력치를 나타내는 개의 정수 공백으로 구분되어 주어진다. 

출력

첫째 줄에 동건이가 견학 보낼 수 있는 최대 팀 수를 출력한다.

Solved.ac 레벨

실버 I

풀이

#include <bits/stdc++.h>

using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n, m, s,e, ans = 0;
    vector<int> v;

    cin >> n >> m;

    for(int i = 0; i < n; i++){
        int input;
        cin >> input;
        v.push_back(input);
    }

    sort(v.begin(), v.end());

    s = 0;
    e = v.size() - 1;

    while(s < e) {
        if(v[s] + v[e] >= m) {
            s++;
            e--;
            ans++;
        } else if(v[s] + v[e] < m){
            s++;
        }
    }

    cout << ans << "\n";



    return 0;
}

정말 간단했던 투 포인터 문제였다.

 

가장 많은 팀을 보내고 싶어하므로, vector를 정렬 후 포인터를 맨 앞과 맨 뒤에 두어 가장 작은 능력치 + 가장 큰 능력치를 비교한 뒤 m보다 크거나 같다면 두 포인터를 각각 앞, 뒤로 보내 범위를 좁혀나가고 팀 수를 1 증가시킨다.

 

v[s]와 v[e]의 합이 m보다 작다면 작은 값을 가리키는 포인터인 s를 증가시켜 범위를 좁혀나간다.

 

 

26091번: 현대모비스 소프트웨어 아카데미

첫째 줄에 견학을 희망하는 학회원의 수 $N$과 견학하는 팀의 최소 능력치를 나타내는 정수 $M$이 공백으로 구분되어 주어진다. ($1 \le N \le 100\,000$, $1 \le M \le 10^9$) 둘째 줄에 학회원 $N$명의 능력치

www.acmicpc.net