본문 바로가기

브루트포스

(3)
브루트 포스[4]:두포인터, 중간에서 만나기 (Brute Force[4]:Two Pointers, Meet in the Middle(MITM)) 브루트 포스(brute force) 이러한 브루트 포스방법 중에서 투포인터, 중간에서 만나기에 관해서 소개를 하려고 한다. 두 포인터(Two Pointers) 배열에서 전체의 경우의 수를 반복문을 통해서 찾는 것이 아니라 두개의 포인터를 조작하여 원하는 결과를 얻는 방법이다. 여기서 두개의 포인터를 이용하여 기존보다 시간복잡도가 줄어드는 구조를 만들 수 있다. 두 포인터 예제 2003 - 수들의 합2 https://www.acmicpc.net/problem/2003 A[i]+...+A[j] = M이 되는 i,j 쌍의 개수를 찾는 문제와 같다. 가장 기본적으로 생각 할 수 있는 방법은 반복문을 만드는 것이다. 반복문으로 i와 j를 선택하고 i부터 j까지의 합을 구한다. (i선택 x j선택 x 합더하기 = ..
브루트포스[2] - 재귀 함수 브루트포스 재귀함수를 사용하는 예제 문제풀이 재귀함수 1. 인자구성 2. 정답을 찾음 3. 불가능한 경우 4. 다음 경우 호출 더보기 어떤 재귀함수의 호출이 이전과 영향을 받지 않을 경우 다이나믹으로 바꿀수 있다. 부분수열 : 앞의 정보가 뒤의 정보에 영향을 주므로 다이나믹이 아님 다이나믹 : 앞의 정보를 몰라도 뒤의 정보 풀이가 가능한 경우. 재귀 문제 풀이 6603 로또 : www.acmicpc.net/problem/9663 1 . 재귀 인자 dfs(a : 입력으로 주어진 수, index : 선택할지 말지 결정할 인덱스, cnt : 현재까지 포함한 수의 개수 2. 정답을 찾은 경우 cnt ==6 3. 불가능한 경우 index>=a.size 4. 다음경우 //선택 lotto.push_back(a[ind..
브루트포스[3]:백트레킹(backtracking) 알고리즘 중 하나인 백트레킹 설명과 문제풀이. 백트레킹(backtracking, 퇴각검샘) 백트레킹은 유망성 검사를 만족하는 경우 모든 조합의 수를 살펴보는 것이다. 유망성 검사를 만족하지 않은 경우 많은 부분 조합들을 배제할 수 있고 모든 경우의 수를 모두 찾는 것보다 훨씬 빠르고 풀이 시간이 단축된다. 구현방법은 DFS와 같은 구조이지만 유망성 점검을 하냐 안하냐로 구분된다. 어떤 노드의 유망성 점검후, 유망하지 않으면 그 노드의 부모노드로 되돌아간 후 다른 자손노드를 검색한다. 브루트포스는 모든 방법을 만드는 것이나, 백트레킹은 아무리 해봤자 의미가 없다 싶을 때 호출을 중단하는 것. 백트레킹 알고리즘의 설명에 관해서 매우 설명이 잘되있는 블로그가 있기 때문에 참고하면 좋을 것 같다! idea-sk..