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;
}
'알고리즘' 카테고리의 다른 글
프로그래머스/최소직사각형/cpp (0) | 2022.08.11 |
---|---|
프로그래머스 2016년 cpp (0) | 2022.08.10 |
프로그래머스 타겟넘버 (python) (0) | 2022.08.07 |
백준 (2460) 지능형 기차 2 (python) (0) | 2022.08.06 |
백준 (10818) 최소, 최대 (python) (0) | 2022.08.05 |