C언어/문제풀다 하나씩

백준 15666 n과 m (12) 헷갈렸다.. prev != arr[i]

mcdn 2021. 1. 25. 15:05
반응형

www.acmicpc.net/problem/15666

 

15666번: N과 M (12)

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

www.acmicpc.net

N과 M (12) 성공분류

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

2 초 512 MB 4330 3452 2911 81.427%

문제

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

  • N개의 자연수 중에서 M개를 고른 수열
  • 같은 수를 여러 번 골라도 된다.
  • 고른 수열은 비내림차순이어야 한다.
    • 길이가 K인 수열 A가 A1 ≤ A2 ≤ ... ≤ AK-1 ≤ AK를 만족하면, 비내림차순이라고 한다.

입력

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

둘째 줄에 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 7 7 9 9 9

예제 입력 3 복사

4 4 1 1 2 2

예제 출력 3 복사

1 1 1 1 1 1 1 2 1 1 2 2 1 2 2 2 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, int st)
{
	if (lev == m)
	{
		for (int i = 0; i< m; i++)
			cout << printarr[i] << " ";
		cout << "\n";
		return ;
	}
	int prev = -1;
	for (int i = st; i < n; i++)
	{
		if (prev != arr[i])
		{
			printarr[lev] = arr[i];
			prev = arr[i];
			recv(lev + 1, i);
		}
	}
}

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

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

헷갈렸다.

int prev = -1 을 안하고 직전 프린트 위치 값ㅇ랑 비교하니까 잘 안됐었음 

반응형