티스토리 뷰
728x90
https://www.acmicpc.net/problem/15654
백트래킹
N개의 서로 다른 정수가 주어지고, 그 중에 M개를 뽑아서 만들 수 있는 가능한 수열을 사전순으로 모두 출력하는 문제
접근 방법
백트래킹으로 재귀함수 써서 풀었다.
재귀함수 파라미터로는 n, m, 수열을 담고 있는 배열(candidate), n개의 숫자의 방문여부를 담고 있는 배열을 갖고 다녔음
입력받은 n개의 숫자를 num array에 넣어두고(sort해줌 - 사전순으로 출력하려고), 수열의 첫째자리 부터 담아가면서 방문여부 체크하고
재귀함수 호출하기 반복
그러다가 수열이 m자리가 되면 결과 배열에 넣고 재귀함수를 종료함
코드를 좀..지저분하게 쓴 것 같긴한데..차차 나아지겠죠머
오답노트
아 근데 C++ 백준에서 돌릴 때 vector.size() 자꾸 int랑 비교하면 컴파일 에러 나서..
지금은 int 변수에 한번 담아주면 통과돼서 그렇게 하고 있는데 최대한 for(int s: vector) 이걸로 써야할 것 같음..
소스코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> num;
vector<vector<int>> result;
void recursive(int n, int m, vector<int> arr, vector<bool> visit){
int size = arr.size();
if(size == m){
result.push_back(arr);
} else {
for(int i = 0; i < n; i++){
if(!visit[i]){
vector<int> _arr = arr;
_arr.push_back(num[i]);
vector<bool> _visit = visit;
_visit[i] = true;
recursive(n, m, _arr, _visit);
}
}
}
}
int main(){
int N, M;
cin >> N >> M;
for(int i = 0; i < N; i++){
int n;
cin >> n;
num.push_back(n);
}
sort(num.begin(), num.end());
vector<int> arr;
vector<bool> visit(N,false);
recursive(N, M, arr, visit);
int len = result.size();
for(int i = 0 ; i < len; i++){
for(int j = 0 ; j < M ; j++){
cout << result[i][j] << " ";
}
cout << "\n";
}
return 0;
}
728x90
'알고리즘 문제풀이' 카테고리의 다른 글
[백준 11660] 구간 합 구하기 5 (C++) (0) | 2024.06.24 |
---|---|
[백준 15664] N과 M (9) (C++) (0) | 2024.06.22 |
[백준 18406] 럭키 스트레이트 (C++, Swift) (0) | 2024.06.20 |
[백준 1439] 뒤집기 (C++) (0) | 2024.06.20 |
[백준 3190] 뱀 (C++) (0) | 2024.06.20 |
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 최단경로
- 백트래킹
- 문자열
- 이분탐색
- 알고리즘
- 최대힙
- 자바
- 트리
- 동적계획법
- c++
- 프로그래머스
- 스택
- 정렬
- 파이썬
- Stack
- 수학
- 게임이론
- 투포인터
- dp
- 백준
- 브루트포스
- BFS
- 최소힙
- 그리디알고리즘
- 다이나믹프로그래밍
- 토마토
- Swift
- 우선순위큐
- dfs
- 웹크롤링
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함