-
[C++] 백준 15654번 - N과 M(5) (백트래킹) 문제알고리즘 문제풀이/백준 2024. 1. 10. 21:17반응형
#백준 15654번 N과 M(5)
백준 15654번 문제는 백트래킹 개념과 dfs 개념만 알고 있으면 쉽게 해결할 수 있는 문제이다.
바로 전에 N과 M(4)를 풀고와서 혼자 힘으로 해결할 수 있었다. 개꿀!
문제 링크
https://www.acmicpc.net/problem/15654
15654번: N과 M (5)
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다. N개의 자연수 중에서 M개를 고른 수열
www.acmicpc.net
알고리즘
이 문제에 대한 자세한 플로우는 비슷한 문제인 N과 M(4)에 흐름을 자세히 설명해 생략하겠다.
[C++] 백준 15652번 - N과 M(4) (백트래킹) 문제 풀이
#백준 15652번 N과 M(4) 백준 15652번 문제는 문제도 간단해서 언뜻 보기에는 쉬워 보이지만 백트래킹, 재귀에 관한 개념이 제대로 잡혀 있지 않다면 본인처럼 헤맬 수 있다. 문제 링크 https://www.acmicpc
rainycode.tistory.com
이 문제만의 특징은 중복을 해결하는 것이다. 그것은 dfs에서 흔히 사용하는 visited 배열을 사용해서 해결할 수 있다.
인덱스로 배열의 원소를 사용했는지 체크하면서 백트래킹을 거슬러 올라가면 문제를 해결할 수 있을 것이다.
코드
#include <iostream> #include <algorithm> #define MAX 8 using namespace std; int N, M; int arr[MAX]; int seq[MAX]; int visited[MAX]; void dfs(int num, int k){ if(k==M){ for(auto i = 0; i < M; i++){ cout << seq[i] << ' '; } cout << '\n'; }else{ for(auto i = num; i < N; i++){ if(visited[i]==1) continue; seq[k]=arr[i]; visited[i]=1; dfs(num, k+1); visited[i]=0; } } } int main() { cin >> N >> M; int k; for (auto i = 0; i < N; i++){ cin >> k; arr[i]=k; } sort(arr, arr + N); dfs(0,0); return 0; }
제출 결과
두 번만에 성공~ 슬슬 감이 좀 살아날지도..? 반응형'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[C++] 백준 12865번 - 평범한 배낭 (knapsack) 문제 (0) 2024.01.12 [C++] 백준 9663번 - N-Queen (백트래킹) 문제 (0) 2024.01.12 [C++] 백준 15652번 - N과 M(4) (백트래킹) 문제 풀이 (2) 2024.01.10 [Python] 백준 11779번 최소비용 구하기 2 - 다익스트라 알고리즘 최단경로 구하기 (0) 2023.05.24 [Python] 백준 1753번 - 최단경로(다익스트라 알고리즘) 문제풀이 (0) 2023.05.22