C언어

백준 15665번 : N 과 M 11번 prinarr != arr[i]

mcdn 2021. 1. 24. 18:07
반응형

N과 M (11) 성공분류

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 512 MB 4559 3410 2781 75.756%

문제

N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.

  • N개의 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.

입력

첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 7)

둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.

출력

한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.

수열은 사전 순으로 증가하는 순서로 출력해야 한다.

예제 입력 1 복사

3 1 4 4 2

예제 출력 1 복사

2 4

예제 입력 2 복사

4 2 9 7 9 1

예제 출력 2 복사

1 1 1 7 1 9 7 1 7 7 7 9 9 1 9 7 9 9

예제 입력 3 복사

4 4 1 1 2 2

예제 출력 3 복사

1 1 1 1 1 1 1 2 1 1 2 1 1 1 2 2 1 2 1 1 1 2 1 2 1 2 2 1 1 2 2 2 2 1 1 1 2 1 1 2 2 1 2 1 2 1 2 2 2 2 1 1 2 2 1 2 2 2 2 1 2 2 2 2

#include <iostream>
using namespace std;

int arr[8];
int printarr[8];
int n, m;

void	sort_up(int arr[8], int num) // sort(arr, arr+n) algorithm
{
	int tmp;

	for (int i = 0; i < num - 1; i++)
	{
		for (int j = i + 1; j < num; j++)
		{
			if (arr[i] > arr[j])
			{
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
				//cout << arr[i] << arr[j] << " ";
			}
		}
	}
}

void	recv(int lev)
{
	if (lev == m)
	{
		for (int i = 0; i< m; i++)
			cout << printarr[i] << " ";
		cout << "\n";
		return ;
	}
	for (int i = 0; i < n; i++)
	{
		if (printarr[lev] != arr[i])
		{
			printarr[lev] = arr[i];
			recv(lev + 1);
		}
	}
}

int main(void)
{
	cin >> n >> m;

	for (int i = 0; i < n; i++)
		cin >> arr[i];
	sort_up(arr, n);
	recv(0);
}

 

 clean!

반응형