본문 바로가기

Archived(CSE Programming)/알고리즘(C++)

(55)
브루트포스_연습2 1. 스타트와 링크 -> 비트마스크 활용하기 핵심은 스타트와 링크, 총 2팀!! 2팀이기에 0과 1 이진수를 통해 bitmask로 해결 0 ~ (1 n; vector d; // 입력 for (int i = 0; i > temp[j]; d.push_back(temp); } // bitmask 활용 int min = 2000; // 1 ~ 2^n-1 for (int i = 0; i < (1 ch; temp[j] = ch - '0'; } d.push_back(temp); } // 0~ 1^(n+m)-1 for (int i = 0; i < (1
브루트포스_연습 1. 리모컨 문제 : https://www.acmicpc.net/problem/1107 1107번: 리모컨 첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다. www.acmicpc.net 숫자를 누르는 순간 지금까지 눌렀던 +,- 는 의미 없어짐. 중복이 있는 경우는 절대 최소가 될 수 없다. 숫자 다음에 +,-가 결정되야함 +와 - 중 하나만 써야함 이동할 채널 C를 정한다(0~100만) C에 고장난 숫자가 있는지 결정(수를 하나씩 체크), 가능하면 몇번 누르는지 횟수 반환하기 두 채널..
다이나믹 프로그래밍 문제 2 1. 가장 긴 증가하는 부분 수열(LIS) 문제 : https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. www.acmicpc.net 풀이 #include #include #include using namespace std; int main() { int n, max = 1; cin >> n; vector d(n + 1, 1); vector a(n + 1, 0); for (int ..
다이나믹 프로그래밍 문제 1. 1,2,3 더하기 5 문제 : https://www.acmicpc.net/problem/15990 15990번: 1, 2, 3 더하기 5 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 풀이 #include #include #include using namespace std; int main() { int m; cin >> m; int l = 100000; long long mod = 1000000009; vector d; d.assign(l+1, vector(4)); // 초기화 d[1][1] = 1, d[1][2] = 0, d[1][3] = 0; d[2][1] = 0, d[2][2] = 1,..
다이나믹 프로그래밍(Dynamic Programming) 1. 의미 다이나믹 프로그래밍이란, 동적계획법이라고도 불리는데 위키백과에 따르면 다음과 같다. 수학과 컴퓨터 공학, 그리고 경제학에서 동적 계획법(動的計劃法, dynamic programming)이란 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법을 말한다. 이것은 부분 문제 반복과 최적 부분 구조를 가지고 있는 알고리즘을 일반적인 방법에 비해 더욱 적은 시간 내에 풀 때 사용한다. 복잡한 문제를 간단한 여러 개의 문제로 나누어 푼다는 것이 핵심이다! 요약하면 큰 문제 -> 작은 문제로 나눠서 푸는 알고리즘이다. 그런데, 분할정복도 큰 문제를 작은 문제로 나눠서 푸는 알고리즘이다. 단, 분할 정복은 작은 문제들이 중복이 되진 않지만, 다이나믹 프로그래밍은 중복된 작은문제를 푸는 것이라는 차이점이..
그래프의 심화 플러드 필 어떤 위치와 연결된 모든 위치를 찾는 알고리즘 연결 요소를 찾기와 유사한 문제 -> 그래프 문제 그렇지만 인접 행렬이나 리스트 만들 필요 없다, 단순히 주어진 이차원 배열을 통해 dfs, bfs로 탐색하면 모든 문제를 해결할 수 있다. 1. 단지번호 붙이기 문제 : https://www.acmicpc.net/problem/2667 2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. 는 을 단지별로..
그래프의 탐색(DFS, BFS) 그래프의 탐색 목적 : 시작점으로부터 시작해서 모든 정점 한번씩 탐색 DFS(Depth First Search) 깊이우선탐색 - 스택(Stack) 통해 갈 수 있을 때 까지 계속 가다가 갈 수 없으면 이전 정점으로 돌아오기 1) 인접 행렬 통한 구현 2) 인접 리스트 통한 구현 3) 시간복잡도 인접행렬 O(V^2) 인접리스트 O(V+E) BFS(Breath First Search) 너비우선탐색 - 큐(Queue) 통해 현재 갈 수 있는 정점 다 담아둔 다음에 차례로 탐색. 1) 인접 행렬 통한 구현 2) 인접 리스트 통한 구현 3) 시간복잡도 인접행렬 O(V^2) 인접리스트(V+E) 1. DFS & BFS #include #include #include #include using namespace std..
그래프(Graph) 그래프는 용어가 많고 중요한 만큼 용어 개념을 확실히 정리해야 한다. 1. 그래프의 개념 먼저 그래프의 개념은, 일련의 노드(node, vertex, 정점, 꼭지점)V와 엣지(edge, 간선, 변) E로 구성된 자료구조이다. 이러한 그래프의 정보는 정점과 정점 간의 간선이 어떻게 연결되어 구성이 되어있는지의 정보도 포함된 형태를 뜻한다. 그래프에서 경로(path)란 노드들의 나열로 구성된 묶음을 뜻한다. 일종의 시퀀스로, 노드들의 간선을 따라 하나의 경로를 구성하게 된다. 이 때 Edge가 겹치지 않게 되면 단순 경로(Simple path)라고 일컫는다. 위의 이미지의 경우 v1-v2-v3-v4-v5 와 같이 v1~v5로 가는 path를 나열할 수 있다. 사이클의 경우에는 경로 중에서 출발점과 도착점이 ..