이를 위해서 현재 선택된 수 보다 1개 높은 위치의 수를 부터 수열을 만들어 나가야 한다.
이를 위해서 NM2(재귀함수)에 start해야 할 위치를 인자로 넘겨주는 부분이 수정되었다.
그리고 항상 다음 수를 대상으로 수열을 만들어 나가기 때문에 중복체크를 위한 included배열은 필요없다.
#include <bits/stdc++.h>
using namespace std;
//bool included[10]; //중복 체크
vector <int> nm;
void NM2(int, int, int);
int main() {
int n, m;
cin >> n >> m;
NM2(1, n, m);
return 0;
}
void NM2(int s, int n, int m) {
if (nm.size() == m) {
for (int i = 0; i < m; i++) {
cout << nm[i] << " ";
}
cout << '\n';
return;
}
for (int i = s; i <= n; i++) {
//if (!included[i]) {
//included[i] = true;
nm.push_back(i);
NM2(i + 1, n, m); //현재 nm vector에 넣은 수 이후 수를 확인 한다. (오름차순)
nm.pop_back();
//included[i] = false;
//}
}
}
두번째 풀이
각 수들을 포함 하거나 또는 포함 하지않으면서 다음수로 넘어가는 형태
#include <bits/stdc++.h>
using namespace std;
vector <int> nm;
void NM2(int level, int n, int m);
int main() {
int n, m;
cin >> n >> m;
NM2(1, n, m);
return 0;
}
void NM2(int level, int n, int m) {
if (nm.size() == m) {
for (int i = 0; i < m; i++) {
cout << nm[i] << " ";
}
cout << '\n';
return;
}
if (level > n) return;
nm.push_back(level);
NM2(level + 1, n, m);
nm.pop_back();
NM2(level + 1, n, m);
}
세번째 풀이
배열을 사용해서 결과값을 저장한 위치에 해당하는 index 인자를 관리해주고,
오름차순을 위해 다음 수를 지정해주는 start를 관리해 주는 형태
#include <bits/stdc++.h>
using namespace std;
int res[10];
void go(int index, int start, int n, int m);
int main() {
int n, m;
cin >> n >> m;
go(0, 1, n, m);
return 0;
}
void go(int index, int start, int n, int m) {
if (index == m) {
for (int i = 0; i < m; i++) {
cout << res[i];
if (i != m - 1) cout << ' ';
}
cout << '\n';
return;
}
for (int i = start; i <= n; i++) {
res[index] = i;
go(index + 1, i + 1, n, m);
}
}
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
N=4, M=4가 주어지면, 아래와 같이 12(4*3)개의 경우가 발생한다.
아래 1 4 와 4 1과 같이 순서가 다른 경우는 다른 것으로 판단해야 함.
1 2 1 3 1 4 2 1 2 3 2 4 3 1 3 2 3 4 4 1 4 2 4 3
"중복 없이"라는 조건이 있음으로 한번 수열에 포함된 수는 수열을 완성할때까지 다시 포함되면 안됨으로 포함 여부를 판단하기 위해 included라는 배열을 사용한다.
n = 4, m = 2를 입력하면, 아래와 같은 순서로 실행된다.
"1. go(4,2)" : nm에 1추가 (nm = 1)
"2. go(4,2)" : nm에 2추가 (nm = 1,2)
"3. go(4,2)" : nm.size()가 m임으로 nm의 내용 1,2 출력 후 return
"2. go(4,2)" 로 돌아감. nm에서 2를 pop_bakc하고, for문을 통해 i 증가시킨 후 nm에 3을 추가함.
#include <bits/stdc++.h>
using namespace std;
bool included[10]; //중복 체크
vector <int> nm;
void NM1(int, int);
int main() {
int n, m;
cin >> n >> m;
NM1(n, m);
return 0;
}
void NM1(int n, int m) {
if (nm.size() == m) {
for (int i = 0; i < m; i++) {
cout << nm[i] << " ";
}
cout << '\n';
return;
}
for (int i = 1; i <= n; i++) {
if (!included[i]) {
included[i] = true;
nm.push_back(i);
NM1(n, m);
nm.pop_back();
included[i] = false;
}
}
}
Flutter를 이용해 앱들 만들어 보기로 했다. 앱만드는 방법은 다양한다. 첫째와 함께 만들기위해 앱인벤터를 사용해 보려고 했지만, 좀더 욕심을 내서 Flutter를 사용해 앱개발을 시작할 예정이다. Flutter로 앱개발을 하기로 결정한 이유는 간단하다. - Google - 한방에 안드로이드 , 아이폰 앱을 만들수있다 - 예쁘고 고민할 것이 별로 없는 UI 만들기 - 개발 과정에서 선택폭이 거의 없다보니, 고민할것이 없고 앱개발에만 집중할수있을것 같다. 결과적으로 이 이유가 Flutter를 결정하는데 가장큰 이유였다. 나의 여러가지 시행착오를 여기 블로그에 남길것이고, 나와 비슷한 경험을 하는 이들에게 조금이나마 도움이 되었으면 한다.