Algorithm/문제풀이

[그리디 알고리즘] AB

lee308812 2019. 11. 18. 10:46

예제 입력 1

3 2

예제 출력 1

ABB

예제 입력 2

2 0

예제 출력 2

BA

예제 입력 3

5 8

예제 출력 3

-1

예제 입력 4

10 12

예제 출력 4

BAABBABAAB

 

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

 

12970번: AB

첫째 줄에 문제의 조건을 만족하는 문자열 S를 출력한다. 가능한 S가 여러 가지라면, 아무거나 출력한다. 만약, 그러한 S가 존재하지 않는 경우에는 -1을 출력한다.

www.acmicpc.net

- A가 a개 있고, B가 b개 있으면(a+b == N) 0 <= i < j < N이면서 s[i] == 'A', s[j] == 'B'를 만족하는 쌍을 0 ~ a*b개 만들 수 있다. 

- BBBBBB가 있을 때, A를 맨 앞에 두면 6쌍, A를 제일 끝에 두면 0쌍 이런식이며 A를 계속 추가하여 늘릴 수 있다.

- 먼저 A+B == N을 만족하도록 A와 B의 개수를 각각 정해보면서, K <= a*b 이면 K개 만들 수 있으므로 만족하는 경우를 문제의 조건에 따라 아무거나 출력하면 된다.

#include <stdio.h>

const int MAX_COUNT = 51;

int N, K;
int arr[MAX_COUNT];

inline int MIN(int a, int b)
{
	return a < b ? a : b;
}

int main(void)
{
	scanf("%d %d", &N, &K);

	for (int a = 0; a <= N; a++)
	{
		int b = N - a;

		if (a * b < K) continue;

		for (int i = 0; i < a; i++)
		{
			int x = MIN(b, K);
			arr[x] += 1;
			K -= x;
		}

		for (int i = b; i >= 0; i--)
		{
			for (int j = 0; j < arr[i]; j++)
			{
				printf("A");
			}

			if (i > 0) printf("B");
		}

		printf("\n");
		return 0;
	}

	printf("-1\n");
	return 0;
}

 

'Algorithm > 문제풀이' 카테고리의 다른 글

[그리디 알고리즘] NMK  (0) 2019.11.19
[그리디 알고리즘] A와 B  (0) 2019.11.18
[그리디 알고리즘] 병든 나이트  (0) 2019.11.18
[그리디 알고리즘] 30  (0) 2019.11.12
[그리디 알고리즘] 수 묶기  (0) 2019.11.09