728x90
SMALL
백준 문제 풀이: 10974번 [모든 순열]
문제 링크: https://www.acmicpc.net/problem/10974
문제 설명:
자연수 N이 주어질 때, 1부터 N까지의 모든 순열을 사전 순으로 출력하는 문제입니다. N은 최대 8이며, 모든 순열을 출력해야 합니다.
문제 해결 코드
#include <iostream>
#include <string>
using namespace std;
int visited[9]; // 방문 여부를 저장하는 배열
// DFS를 사용하여 모든 순열 생성
void dfs(int x, int d, string s) {
if (d > x) { // 길이가 N인 순열이 생성된 경우
for (int i = 0; i < s.size(); i++) {
cout << s[i] << ' '; // 순열 출력
}
cout << '\n';
return;
}
for (int i = 1; i <= x; i++) {
if (visited[i] == 0) { // 아직 사용하지 않은 숫자라면
visited[i] = 1; // 방문 표시
dfs(x, d + 1, s + to_string(i)); // 다음 숫자를 추가
visited[i] = 0; // 방문 해제
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n; // 입력: N
dfs(n, 1, ""); // DFS 호출
}
코드 설명
위 코드는 DFS를 사용하여 모든 순열을 생성하고 출력합니다. 주요 로직은 다음과 같습니다:
- DFS로 순열 생성: 현재까지의 순열을 문자열로 저장하며, 길이가 N이 될 때까지 재귀적으로 호출합니다.
- 방문 체크: 이미 사용한 숫자는 `visited` 배열을 통해 중복 선택을 방지합니다.
- 결과 출력: 길이가 N인 순열이 완성되면 각 숫자를 출력합니다.
시간 복잡도:
- DFS로 모든 순열을 탐색하므로 O(N!)의 시간 복잡도를 가집니다.
결과
위 코드는 입력된 N에 대해 1부터 N까지의 모든 순열을 사전 순으로 정확히 출력합니다. 추가적인 최적화나 대체 구현 방식이 있다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 브루트포스' 카테고리의 다른 글
백준 9742번 [순열](C++) -yes6686- 티스토리 (0) | 2024.11.15 |
---|---|
백준 8892번 [팰린드롬](C++) -yes6686- 티스토리 (0) | 2024.11.14 |
백준 5671번 [호텔 방 번호](C++) -yes6686- 티스토리 (0) | 2024.11.13 |
백준 1526번 [가장 큰 금민수](C++) -yes6686- 티스토리 (0) | 2024.11.13 |
백준 2003번 [수들의 합 2](C++) -yes6686- 티스토리 (2) | 2024.09.02 |