프로그래머스 체육복

문제

1

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/42862#

풀이

배열 하나를 만들고 체육복을 1개씩 할당한다음 배열에서 여분을 가진 사람은 1개추가 잃어버린 사람은 1개 감소 시킨다.

체육복을 잃어버려 0개를 가진 학생의 앞이나 뒤에 배열 학생이 2개 가지고 있는 경우 1개 가져오는식으로 계산한다.

그리고나서 체육복을 1개이상 가진 학생들의 수를 리턴하도록 했다.

using namespace std;

int solution(int n, vector<int> lost, vector<int> reserve) 
{
	int answer = 0;
	int resSize = reserve.size();
	int lostSize = lost.size();
	vector<int> arr(n,1); // 처음에 모두 체육복 1개씩 할당

	sort(lost.begin(), lost.end());
	sort(reserve.begin(), reserve.end());

	
	for (int i = 0; i < resSize; i++) // 여분가진애들 ++
	{
		arr[reserve[i]-1]++;
	}

	for (int i = 0; i < lostSize; i++) // 도둑맞은애들 --
	{
		arr[lost[i]-1]--;
	}

	if (arr[0] == 0) // 첫번째 친구가 체육복 없을경우
	{
		if (arr[1] == 2)
		{
			arr[0]++;
			arr[1]--;
		}
	}

	for (int i = 1; i < n-1; i++) // 그사이 친구들중 체육복 없는애들
	{
		if (arr[i] == 0) 
		{
			if (arr[i - 1] == 2) // 앞에친구한테 받아보기
			{
				arr[i - 1]--;
				arr[i]++;
			}
			else if (arr[i + 1] == 2) // 앞에친구 없으면 뒤에친구한테 받아보기
			{
				arr[i + 1]--;
				arr[i]++;
			}
		}
	}

	if (arr[n - 1] == 0) // 마지막 친구가 체육복 없는 경우
	{
		if (arr[n - 2] == 2)
		{
			arr[n - 2]--;
			arr[n - 1]++;
		}
	}

	for (int i = 0; i < n; i++) // 이제 체육복 가진애들 계산
	{
		if (arr[i] > 0)
		{
			answer++;
		}
	}

	return answer;
}

댓글남기기