Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준
- graph #최단경로
- 30870
- LIS #가장긴증가하는부분수열 #
- BOJ
- graph
- 백준 #다익스트라 #dijkstra #9370 #c++
- backtracking #codetree #디버깅 #삼성코테
- N번째큰수
- c++ #boj #
- 사이클 없는 그래프
- 진법변환 #2to10 #10to2 #이진법 #십진법 #변환 #bitset #c++
- C++
- hcpc
- 22869
- 3D #Reconstruction #computer #vision #volume #metric #tsdf #kinect #fusion
- 코딩
- boj #백준
- 호반우 상인
- 3343
- 레드아보
- 1174
- 20117
- 쌤쌤쌤
- 투포인터 #백준 #boj #20922 #22862
- 16202
- 줄어드는수
- 최소 #공배수 #최대 #공약수 #유클리드 #호제법 #lcm #gcd #c++ #boj #3343 #백준 #장미
- c++ #입출력 #속도 #ios #sync_with_stdio #cin #cout #tie
- 이분탐색 #dp #11053
Archives
- Today
- Total
hyunjin
[BOJ 15663/15664 c++]N과 M, set, backtracking 본문
728x90
15663 set 풀이
set은 키의 중복 허용하지 않고 키값 정렬시킨다.
//참고 사이트 https://tooo1.tistory.com/327
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
#define MAX 9
using namespace std;
int N,M;
int num[MAX]; //input
bool visited[MAX]={0,};
int arr[MAX];
set<vector<int>> s;
void Backtrack(int depth){//depth : depth이자 arr의 index
if(depth == M){
vector<int> v;
for(auto i = 0; i<M;i++){
v.push_back(arr[i]);
}
s.insert(v);
return;
}
for(int i = 0 ; i < N ;i++){
if(visited[i]) continue;
visited[i] = true;
arr[depth] = num[i];
Backtrack(depth+1);
visited[i]=false;
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>N>>M;
for(int i = 0 ; i<N; i++) cin>>num[i];
sort(num,num+N);
Backtrack(0);//depth 의미
for(auto v : s){
for(auto e : v){
cout<<e<<" ";
}
cout<<"\n";
}
}
15664 set 풀이
#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
#define MAX 9
using namespace std;
int N,M;
int num[MAX];
bool visited[MAX]={0,};
set<vector<int>> answer;
int arr[MAX];
void BackTrack(int depth){
if(depth == M){
vector<int> v;
for(int i = 0; i < M ; i++){
v.push_back(arr[i]);
}
sort(v.begin(),v.end());
answer.insert(v);
return;
}
for(int i = 0 ; i < N ;i++){
if(visited[i]) continue;
arr[depth] = num[i];
visited[i] = true;
BackTrack(depth+1);
visited[i] = false;
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>N>>M;
for(int i= 0; i < N ;i++)cin>>num[i];
sort(num,num+N);
BackTrack(0);
for(auto v : answer){
for(int e : v){
cout<<e<<" ";
}
cout<<"\n";
}
}
15663 번과 비슷하게 set을 이용해 풀었다.
15664 set 이용하지 않음
#include <iostream>
#include <vector>
#include <algorithm>
#define MAX 9
using namespace std;
int N,M;
int input[MAX];
bool visited[MAX]={0,};
int arr[MAX];
void BackTrack(int depth){
if(depth == M){
for(int i = 0 ; i < M ;i++){
cout<<arr[i]<<" ";
}
cout<<"\n";
return;
}
int flag = 0;
for(int i = 0 ; i < N ;i++){
if(!visited[i] && flag != input[i]){
if(depth){
if(arr[depth-1] > input[i]) continue;
}
visited[i]=true;
flag = arr[depth] = input[i];
BackTrack(depth+1);
visited[i]=false;
}
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>N>>M;
for(int i= 0; i < N ;i++)cin>>input[i];
sort(input,input+N);
BackTrack(0);
}
set을 이용하지 않으니 약간 헷갈렸다.
flag의 용도는 중복되는 숫자를 만들지 않기 위함이다.
이렇게 flag를 사용해서 중복 방지한다.
약간 헷갈린다. set을 사용하지 않고 15663 번도 풀어봐야겠다.
728x90
'알고리즘 연습 > 백준' 카테고리의 다른 글
[투포인터 BOJ20922 BOJ22862] (0) | 2024.04.20 |
---|---|
[가장 긴 증가하는 부분 수열] LIS, DP, 이분탐색 (0) | 2024.04.19 |
[C++][BOJ 7662 이중 우선순위 큐] multiset (0) | 2021.12.15 |
[C++][BOJ 1629 곱셈] pow 연산 줄이기 (0) | 2021.12.06 |
[C++][BOJ 2170 선긋기] (0) | 2021.09.09 |