[Algorithm] 백트래킹과 순열, 조합
·
Programming/Algorithm & Data Structure
백트래킹이란?백트래킹은 가능한 모든 경우의 수를 따라 들어가면서 탐색하는 알고리즘이다.답이 될 수 없는 경우 더 이상 탐색하지 않고 뒤로 돌아간다.주로 재귀 함수를 사용해 구현한다.시간 복잡도는 O(N!)으로 매우 큰 편이다. 그렇기 때문에 백트래킹 관련 문제에서는 N이 작게 주어진다. 백트래킹 구현에서 가장 중요한 점은 방문 상태 변화 & 상태 원상 복구 두 가지다. 로직을 작성할 때 항상 염두에 두자.백트래킹과 순열, 조합순열과 조합을 구할 때, 가능한 모든 경우의 수에 대해 검사하기 때문에 백트래킹을 사용할 수 있다.아래에서 설명하는 순열과 조합은 오름차순으로 정렬된 집합을 기준으로 한다. 아래 코드에서 공통적으로 나오는 변수들은 다음을 나타낸다.isUsed[i]: i번째 수가 사용되었는 지 여부를..
[백준 9663] N-Queen
·
Programming/PS
문제https://www.acmicpc.net/problem/9663 해당 문제에 대한 풀이는 다음 블로그 글을 참고함https://blog.encrypted.gg/945 [실전 알고리즘] 0x0C강 - 백트래킹이번에는 백트래킹을 배워보도록 하겠습니다. 백트래킹도 재귀와 더불어 많은 사람들이 고통을 호소하는 알고리즘 중 하나이지만 의외로 그 재귀적인 구조에 매료되어서 참재미를 알아버리는blog.encrypted.gg 백트래킹과 브루트 포스를 이용하는 문제다.코드// 위아래, 대각선에 대해 isUsed 배열 3개를 사용// isUsed_vertical: 같은 열에 퀸이 있는지 여부// isUsed_leftDown_rightUp: 왼쪽 아래-오른쪽 위 대각선 상에 퀸이 있는지 여부// isUsed_leftU..
[백준 1697] 숨바꼭질
·
Programming/PS
문제https://www.acmicpc.net/problem/1697코드// 첫 번째 풀이// for + switch문 사용#include using namespace std;int N, K;queue q;int line[100001]; // 이동 거리를 저장할 배열void LineBFS() { while (!q.empty()) { auto x = q.front(); q.pop(); // X-1, X+1, 2*X 모두 범위, 이미 방문한 곳인지, K와 같은 지 확인 for (int i = 0; i = 100001) break; // 범위 벗어나면 if (line[x - 1] != -1) break; // 이미 방문했으면 line[x - 1] = line[x] + 1; q.pus..
[백준 1012] 유기농 배추
·
Programming/PS
문제https://www.acmicpc.net/problem/1012코드#include using namespace std;int matrix[50][50];int T, M, N, K, X, Y;int cnt = 0;queue> q;int dy[4] = { -1, 1, 0, 0 };int dx[4] = { 0, 0, -1, 1 };void BFS() { while (!q.empty()) { pair front = q.front(); q.pop(); for (int i = 0; i = M || newY = N) continue; if (matrix[newY][newX] != 1) continue; matrix[newY][newX] = 0; // 방문 처리 q.push(make_pair(new..
[C#] delegate, action, event
·
Programming/C#
커플링 현상커플링 현상은 여러 클래스들이 코드 상에서 복잡하게 연결되어 있는 것을 말한다. 커플링 현상이 심해질 수록 유지보수가 어려운 코드가 된다.델리게이트델리게이트(delegate)의 사전적 의미는 '대표자', '대리자' 라는 뜻이다. 델리게이트는 일종의 메서드 리스트라고 생각하면 이해하기 쉽다.(메서드 리스트라는 용어는 단순히 이해를 쉽게 하는 것을 돕기 위해 사용한 비유적 표현이다. 공식 문서에서는 메서드 참조, 메서드 포인터로 설명하는 경우가 많다.) 델리게이트 객체에는 추가된 메서드들의 포인터(참조)가 저장되고, 이를 통해 추가된 메서드들을 코드 상에서 커플링 현상을 줄이면서 여러 기능들을 실행할 수 있다. 여기에서 중요한 점은 델리게이트 자체는 자신의 델리게이트 객체에 어떤 메서드가 추가되었..
[Algorithm] DFS (다차원 배열)
·
Programming/Algorithm & Data Structure
https://blog.encrypted.gg/942 [실전 알고리즘] 0x0A강 - DFS드디어 01 02 03 이렇게 숫자를 넘어서 0A강에 도달했습니다. 아직 완결까지는 한참 남았지만 아무튼 힘을 내서 계속 잘 해봅시다. 아, 참고로 저번 단원보다는 내용이 많지 않아서 편한 마음으로blog.encrypted.gg대부분의 내용을 위의 게시물을 참고해 작성한 글이다.DFS의 기본 개념이전 게시물에서 BFS에 대해 알고 있다는 것을 전제로 설명한다. DFS를 사용하면 다차원 배열에서 각 칸을 깊이를 우선으로 방문할 수 있다. 그리고 DFS는 재귀로도 자주 사용되는데, 여기에서는 스택을 사용한 DFS만 설명하겠다. DFS에는 스택이 사용된다. BFS와 유일하게 다른 점은 큐 대신 스택이 사용된다는 것 밖에..
[Algorithm] BFS (다차원 배열)
·
Programming/Algorithm & Data Structure
https://blog.encrypted.gg/941 [실전 알고리즘] 0x09강 - BFS안녕하세요 여러분, 드디어 올 것이 왔습니다. 마음의 준비를 단단히 하셔야 합니다.. 드디어 실전 알고리즘 강의에서 첫 번째 고비에 도달했는데 이 강의와 함께 이번 고비를 잘 헤쳐나가면 좋blog.encrypted.gg대부분의 내용을 위의 게시물을 참고해 작성한 글이다.BFS의 기본 개념BFS를 사용하면 다차원 배열에서 각 칸을 방문할 때 너비를 우선으로 방문할 수 있다. BFS는 원래 그래프에서 모든 노드를 방문할 때 사용하는 것이 맞지만... 그냥 다차원 배열에서도 사용할 수 있다고 생각하자. (다차원 배열에서의 탐색이 필요한 문제는 전부 BFS로 푼다고 생각해도 된다. DFS는 그래프나 트리에서 자주 사용됨)..
[Algorithm] 델타값을 이용한 상하좌우 탐색
·
Programming/Algorithm & Data Structure
https://www.acmicpc.net/problem/1012 백준 1012 문제를 풀다가 나온 스킬이다. 자주 사용되므로 숙지해두자. 문제에서 2차원 배열에 있는 모든 원소를 하나씩 살펴보면서 그 원소의 상하좌우 원소도 검사하는 작업이 있었다.여기에서 반복문을 통해 x와 y에 델타값을 더해 매우 편하게 상하좌우 탐색을 할 수 있다. 구현 순서는 다음과 같다. (이 정도는 외우자)탐색에 사용할 델타값 배열 만들기기존 좌표에 델타값을 더한 새로운 좌표 구하기새로운 좌표가 배열 인덱스 범위 안에 있는지 검사하기전체 코드는 다음과 같다. (DFS 코드 안에 들어가 있으므로 for문 안쪽만 보면 된다)// 탐색에 사용할 델타값// 상, 하, 좌, 우 순서로 이동int dy[4] = {-1, 1, 0, 0};..
snwdaaa
'분류 전체보기' 카테고리의 글 목록 (4 Page)