[프로그래머스 문제풀이] 25. 체육복

WIGWAG·2023년 1월 9일
0

프로그래머스

목록 보기
25/32

나의 풀이

set_difference라는 차집합을 구하는 표준 라이브러리 함수를 사용해서
체육복이 두 벌인 사람이 잃어버려서 한 벌이 된 사람부터 두 벡터에서 제외시켰다.

그 후 find_if를 통해 체육복을 잃어버린 사람의 앞번호와 뒷번호를 확인해서 빌려줄 사람이 있을 때
reserve에서 해당 번호를 제외시켰다.


🎉완성코드

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) {

	sort(lost.begin(), lost.end());
	sort(reserve.begin(), reserve.end());
	vector<int> lost2;
	vector<int> reserve2;
	set_difference(lost.begin(), lost.end(), reserve.begin(), reserve.end(), back_inserter(lost2));
	set_difference(reserve.begin(), reserve.end(), lost.begin(), lost.end(), back_inserter(reserve2));

	int cover = lost2.size();
	for (auto& d : lost2)
	{
		auto give = find_if(reserve2.begin(), reserve2.end(), [&d](int a) {return (a == d - 1) || (a == d + 1); });
		if (give != reserve2.end())
		{
			reserve2.erase(give);
			--cover;
			continue;
		}
	}

	return n - cover;
}

추천을 많이 받은 풀이

학생 번호를 인덱스로 삼아서 문제를 해결했다.


#include <string>
#include <vector>

using namespace std;
int student[35];
int solution(int n, vector<int> lost, vector<int> reserve) {
    int answer = 0;
    for(int i : reserve) student[i] += 1;
    for(int i : lost) student[i] += -1;
    for(int i = 1; i <= n; i++) {
        if(student[i] == -1) {
            if(student[i-1] == 1) 
                student[i-1] = student[i] = 0;
            else if(student[i+1] == 1) 
                student[i] = student[i+1] = 0;
        }
    }
    for(int i  = 1; i <=n; i++)
        if(student[i] != -1) answer++;

    return answer;
}

체육복 문제 링크

profile
윅왁의 프로그래밍 개발노트

0개의 댓글