N과 M (1)
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 | 512 MB | 70783 | 44259 | 29285 | 61.715% |
문제
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
- 1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
입력
첫째 줄에 자연수 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
출력
한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.
수열은 사전 순으로 증가하는 순서로 출력해야 한다.
예제 입력 1 복사
3 1
예제 출력 1 복사
1
2
3
예제 입력 2 복사
4 2
예제 출력 2 복사
1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3
예제 입력 3 복사
4 4
예제 출력 3 복사
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include<iostream> int n, m; int arr[10]; bool isused[10]; void func(int k) { if (k == m) //만약 k과 m과 같다면 arr을 모두 출력 { for (int i = 0; i < m; i++) { std::cout << arr[i] << ' '; } std::cout << '\n'; return; } for (int i = 1; i <= n; i++) //i를 0부터 n까지 증가시킴 { if (!isused[i]) //확인하지 않은 수가 i라면 { arr[k] = i; //arr[k]에 i 집어넣음 isused[i] = true; //i에 확인 표시 func(k + 1); //재귀 돌림 isused[i] = false; // i에 확인 표시 체크 해제 } } } int main() { std::cin >> n >> m; func(0); } | cs |
sollution
m만큼 재귀를 반복한다.
isused[i]에 true 표시가 되어있으면 i가 arr에 있다는 표시이다.
isused[i]에 false 표시가 되어있으면 i가 arr에 없다는 표시이다.
i를 0부터 n까지 반복문 돌리며 isused[i]에 false 표시가 되어있는지 찾는다.
i가 arr에 없는 게 확인되면 i를 arr에 넣고 isused[i]에 true 표시를 한다. 그리고 재귀를 돌린다.
말만 들으면 복잡해보이지만 사실 생각해보면 간단한 문제.
아직까지 방문하지 않은 수를 확인하는 반복문 함수의 재귀라고 생각할 수 있다.
'coding test > 백준 오답노트' 카테고리의 다른 글
[1269]대칭 차집합 (0) | 2022.11.11 |
---|---|
[단계별로풀어보기][그리디 알고리즘] 회의실 배정 (0) | 2022.11.04 |
[1725]히스토그램 (0) | 2022.10.20 |
[단계별로 풀어보기][재귀] 하노이탑 (0) | 2022.10.06 |