https://www.acmicpc.net/problem/15649
15649번: N과 M (1)
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다. 수열은 사전 순으로 증가하는 순서로 출력해
www.acmicpc.net
#include <iostream>
using namespace std;
int n, m;
int arr[9];
bool isused[9];
void func(int k) {
if (k == m + 1) {
for (int i = 1; i <= m; i++)
cout << arr[i] << " ";
cout << "\n";
}
else {
for (int i = 1; i <= n; i++) {
if (!isused[i]) {
isused[i] = true;
arr[k] = i;
func(k + 1);
isused[i] = false;
}
}
}
}
int main() {
cin >> n >> m;
func(1);
return 0;
}
arr은 수열을 담을 배열, isused는 특정 수가 쓰였는지를 true 혹은 false로 나타내는 배열이다.
3, 2가 들어있는 상태라면 arr[0]=3, arr[1]=2이고 1과 쓰이는 아직 쓰이지 않았는데 2와 3은 쓰였으므로 isused[1]=false, isused[2]=true, isused[3]=true, isused[4]=false이다.
func(k)는 현재 k개까지 수를 택한 상황에서 arr[k]를 정하는 함수이다.
맨 처음 func(1)을 호출하고 func(1)은 arr[1]을 정한 후에 func(2)를 호출한다.
k=m+1이 되었을 때 m개를 모두 택했으니 수열을 출력한 후 함수를 종료한다.
k가 m+1이 아니라면 n까지의 수를 차례로 확인하며 아직 쓰이지 않은 수를 찾아낸다.
!isused[i]는 arr[k]=i, isused[i]=true로 만든 후 func(k+1)을 호출한다.
isused[i]=false arr[k]=i로 둔 상태에서 func(k+1)에 들어갔다가 모든 과정을 끝낸 후이므로 isused[i]=false로 되돌려 수 i가 사용되고 있지 않음을 명시한다. 단, 현재 값이 i인 arr[k]는 굳이 0과 같은 값으로 변경할 필요가 없는데 어차피 자연스럽게 다른 값으로 덮일 예정이라 그런 것이다.
'Algorithm > BAEKJOON' 카테고리의 다른 글
[BOJ] 1987번 알파벳 (C++) (0) | 2021.11.10 |
---|---|
[BOJ] 1927번 최소 힙 (C++) (0) | 2021.11.10 |
[BOJ] 11651번 좌표 정렬하기 2 (C++) (0) | 2021.11.07 |
[BOJ] 11650번 좌표 정렬하기 (C++) (0) | 2021.11.07 |
[BOJ] 2178번 미로 탐색 (C++) (0) | 2021.11.07 |