카테고리 없음

코딩테스트 - 1단계 - 체육복

권멋져 2022. 5. 30. 21:25

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

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

- 문제 파악

체육복을 도난 맞아 체육시간에 참여를 못하는 학생들이 있다. 하지만 다행히 체육복을 여러벌 가지고 있는 학생이 자신과 체격이 비슷한 사람에게 체육복을 빌려주려고 한다. 그러나 한 학생이 빌려줄 수 있는건 1명뿐이고, 여러벌 가져온 학생도 도난 당했을 경우에는 다른 사람에게 체육복을 빌려줄 수 없다. 이 때 체육시간에 가장 많이 참여할 수 있는 학생수를 출력 하라

 

- 정답

조건이 많다. 조건을 하나하나 처리해가면서 해보자.

오름차순 또는 내림차순 정렬을 하여 예상치 못한 경우를 줄여보자.

 

#include "bits/stdc++.h"

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = n - lost.size(); // 체육 수업 가능한 학생
    
    int arr_rsv[32] = {0,};
    int arr_lst[32] = {0,};

    sort(reserve.begin(),reserve.end());
    sort(lost.begin(),lost.end());
    
    for(auto a : reserve)
    {       
        for(auto b : lost)
        { 
            if(a==b)
            {
                answer++;
                arr_rsv[a] = 1;
                arr_lst[b] = 1;
            }
            
        }
    }
    
    for(auto a : reserve)
    {       
        for(auto b : lost)
        {           
            if(!arr_lst[b] && !arr_rsv[a])
            {
                if(b== a-1 || b== a+1)
                {
                    arr_lst[b] = 1;
                    arr_rsv[a] = 1;
                    answer++;
                    break;
                }
            }           
        }
    }
    
    return answer;
}