본문 바로가기

알고리즘

프로그래머스 체육복 (c++)

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

문제


여분의 체육복을 가져온 학생 앞뒤에 안가져온 학생들중 한명에게 체육복을 나눠줄수있다. 이때 여분의 체육복을 가져온학생이 도난당했다면 여분이 없는 학생과 마찬가지이게 된다. 체육복을 입을수 있는 학생의 수를 구하여라.

 

입력


학생수 n (2 <= n <= 30) , 잃어버린 학생 의 리스트, 여벌이 있는 학생의 리스트

 

출력


체육복을 입을수 있는 학생의 수

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0; 
    int studentArr[31]={0,}; // 모든 학생 0으로 초기화
    for(int i=0;i<lost.size();i++){ // 모든 학생 리스트에 잃어버린학생은 -1 여분이 있는 학생은 1을 더해준다.
        studentArr[lost[i]+1] += -1;
    }
    for(int i=0;i<reserve.size();i++){
        studentArr[reserve[i]+1] += 1; // 만약 여분이 있지만 도난당한 학생은 0이된다.
    }
    int sum = 0; // 체육복을 못입는 학생의 합
    for(int i=0;i<=n+1;i++){
        if ((studentArr[i] == -1 && studentArr[i+1] == 1) || (studentArr[i] == 1 && studentArr[i+1] == -1)){ // -1 즉 못입는 학생일때 앞뒤로 여분이 이있는 학생이 있다면 모두입을 수있으므로 0으로 고쳐준다.
            studentArr[i] = 0; // 0 으로 고치는 중 하나는 만약 -1 또는 1이 그대로있다면 1 은 다시 여분을 줄 기회가 생기게 되고 -1 은 다시여분을 받을 준비가되기때문이다.
            studentArr[i+1] = 0;
        }
        else if(studentArr[i] == -1) // 만약 앞뒤에 여분을 줄 학생이 없다면 체육복을 못입는 학생이므로 -1을 더해준다.
            sum-=1;
    }
    answer = n + sum; // 실제 체육복을 입을수있는 학생은 전체학생 - 못입는 학생이다.
    return answer;
}