체육복

원래벌레·2022년 11월 26일

문제


풀이

#include <string>
#include <vector>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    vector<int> v = {-10};
    for(int i=0;i<n;i++)
        v.push_back(1);
    
    v.push_back(-10);
    
    for(int i=0;i<lost.size();i++)
        v[lost[i]]--;
    
    for(int i=0;i<reserve.size();i++)
        v[reserve[i]]++;
    
    for(int i=1;i<=n;i++)
    {
        if(v[i]==0)
        {
            if(v[i-1] == 2)
            {
                v[i-1]--;
                v[i] == 1;
                answer++;
            }
            else if(v[i+1] == 2)
            {
                v[i+1]--;
                v[i] == 1;
                answer++;
            }
        }
        else answer++;
    }

    
        
        
    
    
    return answer;
}

/*

체육복을 도둑맞아서 여벌의 체육복이 있는 학생 것을 빌려주기로함

학생들의 번호는 체격 순으로 매겨짐 바로 앞번호 또는 뒷번호 학생에게만 체육복을 빌릴 수 있음

최대한 많은 사람이 체육복을 빌려 입는 경우

n = 전체 학생의 수

lost = 체육복을 도난당한 학생들의 번호

reserve = 체육복 빌려 줄 수 있는 학생의 번호

전체 학생수는 최대 30

체육복은 1명은 무조건 도난당함

여벌 가져온 사람도 1명이상

여벌을 가져왔는데 도난을 당한 사람은 빌려 줄 수 없음

*/

접근법

시퀀스 컨테이너인 vector에 1을 학생 수 만큼 추가를 했습니다.

이 1이라는 수는 초기화한 숫자로 맨 처음에는 모두가 옷이 있는 상태로 값을 추가를 했습니다.

여기서 인덱스와 번화값이 일치시키게 하기 위하여 0번 인덱스에는 -10 이라는 쓰레기값을 넣어주었습니다.

그리고 lost를 돌면서 인덱스에 해당하는 vector에 값에 값을 -1을 해주었습니다.

그리고 reserve를 돌면서 인덱스에 해당하는 vector에 값을 +1을 해주었습니다.

그런데 여기서 인덱스에 해당하는 값이 0이었다. 하면은 이경우 여분을 가져왔지만 옷 한벌을 도둑맞은 학생이기 때문에 다른 학생에서 옷을 빌려줄 수 없습니다.

이렇게 만들어진 벡터를 돌면서 인덱스에 해당하는 값을 보고 1또는 2일때는 answer의 값을 늘려주고 0일 때는 앞뒤에 인덱스의 값중에서 2가 있다면 answer을 하나 늘려주고, 해당 인덱스의 값을 -1 해줍니다.

profile
학습한 내용을 담은 블로그 입니다.

0개의 댓글