백준 15650,15651

N과 M (2), N과 M(3)

브루트 포스 문제

N과 M을 입력받고, 1부터 N까지, M개의 숫자의 수열을 중복없이 오름차순으로 출력하는 것이다.

N과 M (1) 번을 풀었다면 아주 조금의 코드 수정만 있다면 쉽게 풀 수 있는 문제.
풀지 않았다면 위의 포스팅을 먼저 보고 오시길 바랍니다.

N과 M(2) 문제풀이

go 재귀함수에서 i의 시작점을 1부터 시작하면 모든 index에서 1부터 시작한다.
이 점을 잘 생각해보면 그 전 index에서 사용한 수의 다음부터 저장하면 된다는 것을 알 수 있다.
즉, 반복문의 시작을 이렇게 바꾸면 된다.

int i = a[index-1]+1;

소스

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
bool c[10]; int a[10];
void go(int index, int n, int m) {
	if (index == m)
	{
		for (int i = 0; i < m; i++)
			cout << a[i] << ' ';
		cout << '\n';
		return;
	}
	
	for (int i = a[index-1]+1; i <= n; i++)
	{
		if (c[i])
			continue;
		c[i] = true;
		a[index] = i;
		go(index + 1, n, m);
		c[i] = false;
	}
}
int main() {
	int n,m;
	cin >> n>>m;
	go(0, n, m);
}

N과 M(3) 문제풀이

중복 없이란 말만 빠졌으므로 이전 코드에서 중복을 제거해줬던 check관련 코드 세줄을 제거해 주면 됩니다.

소스

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
bool c[10]; int a[10];
void go(int index, int n, int m) {
	if (index == m)
	{
		for (int i = 0; i < m; i++)
			cout << a[i] << ' ';
		cout << '\n';
		return;
	}
	
	for (int i = 1; i <= n; i++)
	{
		//if (c[i])
		//	continue;
		//c[i] = true;
		a[index] = i;
		go(index + 1, n, m);
		//c[i] = false;
	}
}
int main() {
	int n,m;
	cin >> n>>m;
	go(0, n, m);
}

댓글남기기