코딩테스트/프로그래머스

[프로그래머스] 체육복 (C++)

QuickClid 2025. 3. 21. 20:38

문제 설명

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 solution함수의 매개변수로 주어질 때, 체육복을 입은 채로 체육 수업을 들을 수 있는 최대 학생 수를 return하시오. (단, 여벌의 체육복은 항상 한 벌만 가져오며, 이웃하는 번호를 지닌 학생들끼리만 여벌의 체육복을 빌려줄 수 있다.)

 

입출력 예

더보기

lost = { 2, 3 }, reserve = { 1, 2 }일 때, 

1번 학생은 체육복을 "기본 1벌" + "reserve 1벌" = 2벌 갖고 있고,

2번 학생은 "기본 1벌" + "reserve 1벌" - "잃어버림 1벌" = 1벌 갖고 있고,

3번 학생은 "기본 1벌" - "잃어버림 1벌" = 0벌 갖고 있다.

 

이때, 이웃하는 번호를 지닌 학생들끼리만 체육복을 빌려줄 수 있으므로,

체육복을 2벌 갖고 있는 1번 학생이라 할지라도 3번 학생에게 체육복을 빌려줄 수 없다.

따라서 체육복을 입은 채로 체육 수업을 들을 수 있는 최대 학생 수는 1번, 2번 학생으로 2이다. 

 

 

풀이

1. 일단 모든 학생들이 1벌이 체육복을 가져왔다고 가정하고, cloth_count의 모든 원소(=학생 번호)에 1을 넣어준다.

 

2. 이러한 cloth_count 배열에서, 체육복을 잃어버린 학생들은 cloth_count를 -1씩 해준다.

 

3. 여벌의 체육복을 가져온 학생들에 대해선 cloth_count를 +1씩 해준다.

 

4. 이후 cloth_count가 0인 학생들이 다른 학생들로부터 체육복을 빌릴 수 있는지 확인한다. 

 

코드

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve)
{
    vector<int> cloth_count;
    for (int i = 0; i < n; i++)
        cloth_count.push_back(1);
    for (int i = 0; i < lost.size(); i++)
        cloth_count[lost[i] - 1]--;
    for (int i = 0; i < reserve.size(); i++)
        cloth_count[reserve[i] - 1]++;

    for (int i = 0; i < n; i++)
    {
        if (cloth_count[i] == 0)
        {
            if (i - 1 >= 0 && cloth_count[i - 1] >= 2)
            {
                cloth_count[i - 1]--;
                cloth_count[i]++;
            }
            else if (i + 1 < n && cloth_count[i + 1] >= 2)
            {
                cloth_count[i + 1]--;
                cloth_count[i]++;
            }
        }
    }

    int answer = 0;
    for (int i = 0; i < n; i++)
    {
        if (cloth_count[i] >= 1)
            answer++;
    }
    return answer;
}