[ baekjoon ] 27951번 - 옷걸이

2023. 5. 13. 11:40baekjoon

반응형

https://www.acmicpc.net/problem/27951

 

27951번: 옷걸이

경기과학고등학교에는 아주 무시무시한 부서 하나가 있다. 그 부서의 이름은 바로 '자치부'이다. '자치부'가 하는 주된 역할 중 하나는 아침에 지정된 기숙사에 들어가서 방의 정리 정돈 상태를

www.acmicpc.net

 

 

 

 

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int num;
	scanf("%d", &num);

	int* hanger = (int*)malloc(4 * num * 2);

	int type_num[3] = { 0, };

	for (int i = 0; i < num * 2; i += 2)
	{
		scanf("%d", &hanger[i]);
		type_num[hanger[i] - 1]++;
	}

	int up, down;

	scanf("%d %d", &up, &down);

	int one = type_num[0];
	int three = type_num[2];

	int count = 0;
	int index = 0;
	int index_flag = 1;

	int flag = 1;

	if (three == num) // all hanger == 3
	{
		for (int i = 0; i < up * 2; i += 2)
		{
			hanger[i + 1] = 85;
		}
		for (int i = 0; i < down * 2; i += 2)
		{
			hanger[up * 2 + i + 1] = 68;
		}
		
		flag = 1;
	}

	else
	{
		//up
		while (count != up)
		{
			if (index_flag == 0 && index == num * 2) // no hanger
			{
				flag = 0;
				break;
			}

			if (one != 0)
			{
				if (hanger[index] == 1 && hanger[index + 1] != 85)
				{
					hanger[index + 1] = 85;
					one--;
					count++;
				}
			}

			else
			{
				if (index_flag)
				{
					index = 0;
					index_flag = 0;
				}

				if(hanger[index] == 3 && hanger[index + 1] != 85)
				{
					hanger[index + 1] = 85;
					count++;
				}
			}

			index += 2;
		}

		index = 0;
		count = 0;
		
		//down
		if (flag == 1)
		{
			while (count != down)
			{
				if (index == num * 2 && count != down) // no hanger
				{
					flag = 0;
					break;
				}

				if (hanger[index] == 3 || hanger[index] == 2)
				{
					if (hanger[index + 1] != 85 && hanger[index + 1] != 68)
					{
						hanger[index + 1] = 68;
						count++;
					}
				}

				index += 2;
			}
		}
	}

	if (flag)
	{
		printf("YES\n");
		for (int i = 1; i < num * 2; i += 2)
		{
			printf("%c", hanger[i]);
		}
	}

	else
	{
		printf("NO");
	}

	free(hanger);

	return 0;
}

 

옷걸이가 모두 3이라면 상의와 하의를 순차적으로 걸어준다.

만약 아니라면 일단 1에 상의를 걸고 상의가 남으면 3옷걸이에 건다.

하의도 마찬가지로 2에 먼저 걸고 남으면 3 옷걸이에 건다.

상의와 하의를 걸 때 만약 3 옷걸이도 다 사용했는데 상의 또는 하의가 남으면

flag에 0을 주어 NO를 출력하는 곳으로 이동gksek.

배열에서 0포함 짝수 인덱스에는 옷걸이 종류를(1, 2, 3) 

홀수 인덱스에는 바로 앞 인덱스에 해당하는 옷걸이에 U(상의) 또는 D(하의) 중 어떤것이 걸려있는지가 들어있다. 

 

반응형