본문 바로가기
개발 노트/백준, 프로그래머스 풀이

[백준 15650/c++] N과 M (2)

by tokkiC 2022. 8. 1.

22. 08 .02 코드 수정 - 타 풀이 참고

오름차순 순열의 조건을 새 함수로 설정하지 말고, 백트래킹 함수에 인자를 하나 추가하여

백트래킹 내 재귀 시에 항상 자신의 값보다 더 큰 수를 갖도록 하여 오름차순이 되도록 구현,

더 큰 수 이므로 중복을 체크하기 위한 isused 조건도 빼주어 더욱 간결한 코드로 바꿀 수 있다


22. 08. 01

백트래킹 문제에 오름차순 순열이라는 조건이 걸린 문제이다

해당 수가 이전에 사용된 수들 보다 큰지를 체크 하여 맞을 시 참을 리턴하는 함수를 만들어 (0은 항상 참)

백트래킹의 조건 중 하나로 집어 넣어서 풀었다

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

 

15650번: N과 M (2)

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

www.acmicpc.net

<-- 수정 후 -->

#include <bits/stdc++.h>
using namespace std;

int n, m;
int ar[10];

bool check(int s, int t){
	if (s == 0)
	{
		return true;
	}
	for (int i = 0; i < s; i++)
	{
		if (ar[i] - t > 0)
		{
			return false;
		}
	}
	return true;
}

void bt(int k, int num){
	if (k == m)
	{
		for (int i = 0; i < m; i++)
		{
			cout << ar[i] << " ";
		}
		cout << "\n";
		return;
	}
	for (int i = num; i <= n; i++)
	{
		ar[k] = i;
		bt(k + 1, i + 1);
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	
	cin >> n >> m;
	bt(0, 1);
	
	return 0;
}

<-- 수정 전 -->

#include <bits/stdc++.h>
using namespace std;

int n, m;
int ar[10];
bool isused[10];

bool check(int s, int t){
	if (s == 0)
	{
		return true;
	}
	for (int i = 0; i < s; i++)
	{
		if (ar[i] - t > 0)
		{
			return false;
		}
	}
	return true;
}

void bt(int k){
	if (k == m)
	{
		for (int i = 0; i < m; i++)
		{
			cout << ar[i] << " ";
		}
		cout << "\n";
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if (!isused[i] && check(k, i))
		{
			ar[k] = i;
			isused[i] = true;
			bt(k + 1);
			isused[i] = false;
		}
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	
	cin >> n >> m;
	bt(0);
	
	return 0;
}

'개발 노트 > 백준, 프로그래머스 풀이' 카테고리의 다른 글

[백준 15652/c++] N과 M (4)  (0) 2022.08.03
[백준 15651/c++] N과 M (3)  (0) 2022.08.02
[백준 15649/c++] N과 M (1)  (0) 2022.07.31
[백준 1929/c++] 소수 구하기  (0) 2022.07.30
[백준 11399/c++] ATM  (0) 2022.07.29

댓글