알고리즘/프로그래머스 1단계

프로그래머스 - 전국 대회 선발 고사 - C++

게임만드는학생 2023. 8. 6. 11:29

https://school.programmers.co.kr/learn/courses/30/lessons/181851

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> rank, vector<bool> attendance) {
    int answer = 0;
    int min = rank.size();
    int minId = -1;
    int h = 10000;
    for (int i = 0; i < 3; i++)
    {
        min = rank.size(); minId = -1;
        for (int j = 0; j < rank.size(); j++)
        {
            if (attendance[j] && min >= rank[j])
            {
                min = rank[j];
                minId = j;
            }
        }
        attendance[minId] = false;
        answer += (h * minId);
        h /= 100;
    }

    return answer;
}

 

설명

rank 와 attendance 배열을 보며 참석할 수 있는 사람( true인 사람) 중 가장 등수가 높은 사람( rank[j] 의 수가 가장 작은사람) 을 골라내는 문제이다. 

 

3등까지만 뽑기에 i for문 3번을 돌며 제일 높은 등수인 사람을 가려내고 그 등수의 사람을 false로 만들어서 문제를 해결했다. 

먼저 j for문에서는 단순히 참석할 수 있는 여부의 사람 중 등수가 가장 높은 사람을 min 과 minId 에 저장하여 

j for문이 끝나면 false로 바꾸고 answer에 더했다. 

이렇게 3번 i for문을 돌면 자연스럽게 높은 등수부터 3명이 가려진다.