반응형
rolypolytoy
현's story
rolypolytoy
전체 방문자
오늘
어제
  • 분류 전체보기
    • 현's tory
      • 여행
      • 개인사업
      • 컨프런스
      • 채용지원
    • Vision AI | 3D Graphics
      • Vision AI
      • OpenGL
    • 프로그래밍 언어
      • C++
      • Python
    • Computer Science
      • 운영체제
    • 알고리즘
      • 백준
      • 프로그래머스
      • 개념정리
    • 유용한 링크
      • 개발

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 사회망서비스
  • 백준이분탐색
  • 백준다이나믹
  • IOS
  • 다이나믹프로그래밍
  • EffectiveC++
  • iOSMetal
  • 백준사회망서비스
  • 백준
  • 백준2169
  • vscodeopengl
  • 백준알고리즘
  • 백준17471
  • 디자인패턴
  • 상표특허출원
  • DFS조합
  • 백준2533
  • 프로그래머스실패율
  • 백준1756
  • 아키텍처패턴
  • iOS비동기
  • 백준2302
  • 백준13397
  • c++
  • 백준문제풀이
  • sync
  • PlantUML
  • openglvscode
  • 알고리즘구현
  • 알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
rolypolytoy

현's story

[백준 10974] 모든 순열 C++
알고리즘/백준

[백준 10974] 모든 순열 C++

2020. 7. 17. 15:16
반응형

https://www.acmicpc.net/problem/10974

 

10974번: 모든 순열

N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.

www.acmicpc.net

문제 : N이 주어졌을 때, 1부터 N까지의 수로 이루어진 순열을 사전순으로 출력하는 프로그램을 작성하시오.

 

입력 : 첫째 줄에 N(1 <= N <= 8)이 주어진다

 

출력 : 첫째 줄부터 N! 개의 줄에 걸쳐서 모든 순열을 사전순으로 출력한다.

 

풀이
void go(int depth) {

	if (depth == n) {


		cal_max();

		return;
	}


	for (int i = 0; i < n; i++) {

		if (check[i]) continue;

		check[i] = true;
		selected[depth] = a[i];
		go(depth + 1);
		check[i] = false;
	}


	
}
void solution() {

	cin >> n;

	for (int i = 0; i < n; i++) {

		cin >> a[i];

	}

	go(0);


	cout << result << '\n';
	

}

이 문제는 중복되지는 않지만 순서에 상관없이 경우의 수를 구하는 문제입니다.

따라서, 중복만 되지 않게 check배열로 똑같은 수를 출력하지 않도록 사전에 방지하고, 

구할 수 있는 모든 경우의 수를 다 구하면 됩니다.

예를 들어, 1, 2, 3을 위의 논리로 풀게 되면 (1, 2, ,3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1) 사전순으로 출력하게됩니다.

 

 

#include <iostream>

using namespace std;

#define MAX 8 + 1

int n;
int a[MAX];
int ans[MAX];
bool check[MAX];


void print() {


	for (int i = 0; i < n; i++) {
		cout << ans[i] << ' ';
	}
	cout << '\n';
}
void go(int depth) {

	if (depth == n) {

		print();

		return;
	}

	for (int i = 0; i < n; i++) {

		if (check[i]) continue;

		ans[depth] = a[i];
		check[i] = true;
		go(depth + 1);
		check[i] = false;

	}
}

void solution() {

	cin >> n;

	for (int i = 0; i < n; i++) {
		a[i] = i + 1;
	}

	
	go(0);

}
int main() {


	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	//freopen("Input.txt", "r", stdin);

	solution();


	return 0;
}

 

위의 코드로 풀게되면 됩니다.

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'알고리즘 > 백준' 카테고리의 다른 글

[백준 16922] 로마 숫자 만들기 C++  (0) 2020.07.22
[백준 10971] 외판원 순회 2 C++  (0) 2020.07.17
[백준 10819] 차이를 최대로 C++  (0) 2020.07.17
[백준 2745] 진법 변환 C++  (0) 2020.07.03
[백준 1978] 소수찾기 C++  (0) 2020.07.02
    '알고리즘/백준' 카테고리의 다른 글
    • [백준 16922] 로마 숫자 만들기 C++
    • [백준 10971] 외판원 순회 2 C++
    • [백준 10819] 차이를 최대로 C++
    • [백준 2745] 진법 변환 C++
    rolypolytoy
    rolypolytoy

    티스토리툴바