[BOJ알고리즘, C++]#15654_N과M(5), 백트래킹, 순열 백트래킹

2024. 5. 15. 12:33· 문제 풀이/BOJ 문제 풀이
목차
  1. #1. 문제
  2. #2. 풀이
  3. 1. 백트래킹
  4. 2. 순열 백트래킹 유형, 순서가 중요하며 '중복 선택'이 불가능하다.
  5. #3. 코드

 

#1. 문제

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

 


 

#2. 풀이

 

1. 백트래킹

 

[알고리즘]#6_백 트래킹

[알고리즘]#6_백 트래킹 백 트래킹 알고리즘에 대해 알아보겠습니다. Overview 개념 예제 #0. 개념 1. 백 트래킹 백 트래킹 알고리즘은 문제 해결을 위해 여러 후보 해결책들을 점진적으로 탐색하며,

webddevys.tistory.com

백트래킹 알고리즘은 문제 해결을 위해 여러 후보책들을 점진적으로 탐색하는 알고리즘입니다. 백트래킹 알고리즘은 현재 경로가 해결책으로 이어질 수 없다고 판단되면 이전 단계로 돌아가 다른 후보 경로에 대한 탐색을 진행합니다. 일반적으로, 백트래킹 알고리즘은 재귀 호출을 활용한 DFS를 통해 구현합니다.

 

2. 순열 백트래킹 유형, 순서가 중요하며 '중복 선택'이 불가능하다.

  1. 순열 백트래킹 유형의 문제입니다. 주어진 자연수 목록에서 각 원소를 한 번씩만 선택할 수 있고, 그 순서에 따라서 같은 자연수 조합이라도 다른 부분 수열로 취급됩니다.
  2. 백트래킹 구현 과정에서 같은 자연수가 두 번 이상 선택되는 것을 방지하기 위해, 각 원소에 대하여 방문 여부를 체크해 주는 조합 백트래킹을 설계해야 합니다.

 


 

#3. 코드

 

/*
    @문제 : 자연수 N개를 통해 길이가 M개인 수열을 만드는 경우의 수, 사전 순으로 출력
    @설명
            1. 주어진 입력에 대하여 정렬을 한 번 수행
            2. 순열(nPr) 백트래킹
            3. 결과 출력
*/

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

#define MAX 8

int N, M;
vector<int> arr;
vector<int> res;
vector<bool> visited(MAX, false);

void dfs(int depth)
{
    if(depth == M)
    {
        for(int i=0; i<M; ++i)
            cout << res[i] << ' ';
        cout << '\n';
        return;   
     }

     for(int i=0; i<N; ++i)
     {
        if(!visited[i])
        {
            visited[i] = true;
            res.push_back(arr[i]);
            dfs(depth+1);
            visited[i] = false;
            res.pop_back();
        }
     }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    cin >> N >> M;

    for(int i=0; i<N; ++i)
    {
        int tmp;
        cin >> tmp;

        arr.push_back(tmp);
    }

    sort(begin(arr), end(arr));

    dfs(0);

    return 0;
}

 


 

 

 

저작자표시 (새창열림)

'문제 풀이 > BOJ 문제 풀이' 카테고리의 다른 글

[BOJ알고리즘, C++]#1949_우수마을, 트리 DP  (0) 2024.05.15
[BOJ알고리즘, C++]#10159_저울, 최단 경로, 길 찾기, 플로이드-워셜  (0) 2024.05.15
[BOJ알고리즘, C++]#1182_부분 수열의 합, 백트래킹, 조합 백트래킹  (0) 2024.05.15
[BOJ알고리즘, C++]#3176_도로 네트워크, 트리, LCA, LCA 최단/최장 거리 찾기  (0) 2024.05.06
[BOJ알고리즘, C++]#1761_정점들의 거리, LCA, LCA 최단/최장 거리 찾기  (0) 2024.05.06
  1. #1. 문제
  2. #2. 풀이
  3. 1. 백트래킹
  4. 2. 순열 백트래킹 유형, 순서가 중요하며 '중복 선택'이 불가능하다.
  5. #3. 코드
'문제 풀이/BOJ 문제 풀이' 카테고리의 다른 글
  • [BOJ알고리즘, C++]#1949_우수마을, 트리 DP
  • [BOJ알고리즘, C++]#10159_저울, 최단 경로, 길 찾기, 플로이드-워셜
  • [BOJ알고리즘, C++]#1182_부분 수열의 합, 백트래킹, 조합 백트래킹
  • [BOJ알고리즘, C++]#3176_도로 네트워크, 트리, LCA, LCA 최단/최장 거리 찾기
Hardii2
Hardii2
개발 블로그Hardii2 님의 블로그입니다.
Hardii2
개발 블로그
Hardii2
전체
오늘
어제
  • 분류 전체보기
    • 알고리즘
    • 웹 개발
      • Node.js
      • React
    • 게임개발
      • DirectX12
      • 관련 지식
      • Unreal C++
      • Unreal 블루프린트
    • 언어
      • Effective C++
      • Basic C++
      • 디자인 패턴
      • 자료구조
      • 기술 질문
    • 문제 풀이
      • BOJ 문제 풀이
      • Programmers 문제 풀이
      • geeksForgeeks 문제 풀이
    • 수학
      • 확률과 통계
      • 게임수학
    • 개인프로젝트
    • 그룹프로젝트
      • PM
      • Dev
    • Github

블로그 메뉴

  • 홈
  • 글쓰기

공지사항

인기 글

태그

  • 디자인 패턴
  • unreal
  • 기술 질문
  • BOJ
  • BFS
  • dfs
  • programmers
  • 그래프
  • 알고리즘
  • 트리
  • Effective C++
  • stl
  • set
  • DP
  • 정렬
  • Unreal Blueprint
  • 우선순위 큐
  • C++
  • 개발
  • 최단 경로

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Hardii2
[BOJ알고리즘, C++]#15654_N과M(5), 백트래킹, 순열 백트래킹
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.