본문 바로가기

알고리즘

(43)
백준 알고리즘 기초 - 그래프1 (연습) 2문제 밖에 없는 파트였다. 근데 엄청 헤맸다. 어려웠다. 뭔가 dfs, bfs 문제는 어느정도 감을 잡았다고 생각했는데 진짜 바보 같은 생각이었다 ㅋㅋ 2문제를 잘근잘근 씹어서 내껄로 한번 만들어 봐야겠다. 정리 시작! - * Two Dots (mid) : 사이클이 있는지 판별하는 문제다. 16929번: Two Dots 첫째 줄에 게임판의 크기 N, M이 주어진다. 둘째 줄부터 N개의 줄에 게임판의 상태가 주어진다. 게임판은 모두 점으로 가득차 있고, 게임판의 상태는 점의 색을 의미한다. 점의 색은 알파벳 대문�� www.acmicpc.net - 여기서 말하는 사이클은 4개 이상의 서로 다르고 인접한 점의 집합을 말한다. 당연히 색은 다 같아야 한다. - 사이클을 판별하기 위해서 배열 d[i][j]를 ..
백준 알고리즘 기초 - 그래프1 (연결요소, 이분그래프, 그래프 예제) 요즘 오후 시간이 유독 힘들다.. 체력적인 문제라기보다는 멘탈의 문제인듯 하다. 좀 더 단계적인 목표를 세우고 효율적으로 움직여보자. 정리 시작! - * 연결 요소 : 연결 되지 않고 나눠진 각각의 그래프. 연결 요소의 개수는 dfs, bfs로 구할 수 있다. 11724번: 연결 요소의 개수 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주�� www.acmicpc.net #include #include using namespace std; int n, m; vectors[1001]; bool check[100..
백준 알고리즘 기초 - 그래프1 (BFS, DFS) 그래프 챕터의 시작이다. BFS, DFS 가 꽤나 중요한 알고리즘이기도 하고, 그래프 문제가 어려워지면 끝도 없다는 말을 들었기에 확실하게 하고 넘어가야 할 것 같다. 정리 시작! - * 그래프 : 자료구조의 일종. 어떻게 문제 상황을 구조화 하는지가 관건이다. - 정점 (node, vertex), 간선 (edge) : 정점간의 관계 - 경로 (path), 사이클 / 단순 경로, 단순 사이클 : 같은 정점을 두 번 이상 방문하지 않은 것 - 차수 : 정점과 연결되어 있는 간선의 개수 * 그래프의 표현 - 인접 행렬 : V * V 크기의 이차원 배열 이용. 간선 있으면 1, 없으면 0. - 인접 리스트 : A[i]에 i와 연결된 정점을 리스트로 포함하고 있음. 크기를 동적으로 변경할 수 있어야 함. 인접 ..
백준 알고리즘 기초 - 브루트 포스 (비트마스크) 브루트 포스 마지막 파트다. 여러모로 쓸모 있는 스킬이지만, 특정 문제에만 적용되고, 속도가 좀 느리다는 단점이 있다. 그래도 정리 해뒀다가 잘 써먹자. 정리 시작! - * 비트마스크 : 비트 연산을 사용해서 부분집합을 표현할 때 사용한다. - S에 i를 추가 : S |= (1 a[i]; int ans = 0; for (int i = 1; i > c; vector tmp; for (int j = 0; j < m; j++) { tmp.push_back(c[j] - '0'); } a.push_back(tmp); } check = a; int ans = 0; for (int i = 0; i < (1
백준 알고리즘 기초 - 브루트 포스 (재귀, 백트래킹) 재귀에는 어느정도 익숙해진듯 하다. 재귀를 풀었을 때 특유의 쾌감도 있는듯.. 하지만 갈 길은 아직 멀다.... 정리 시작! - 이전에 풀었던 문제를 재귀를 사용해서 풀어보자. * 1, 2, 3 더하기 (low) : 정수 n을 1,2,3의 합으로 나타내는 방법의 수 구하기 9095번: 1, 2, 3 더하기 문제 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 1+1+1+1 1+1+2 1+2+1 2+1+1 2+2 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 www.acmicpc.net #include using namespace std; int ans = 0; void go(int left, int n)..
백준 알고리즘 기초 - 브루트 포스 (순열) 자소서와 병행하느라 진도가 늦는 기분.. 하지만 속도보다 중요한 건, 확실하게 알고 넘어가는 것! 초조해 하지말자. 정리 시작! - * 순열 : 임의의 수열을 다른 순서로 섞는 연산. 문제를 보면서 이해하자. * 다음 순열(mid) : STL을 사용해도 되지만, 원리를 알기 위해 직접 구현 해보자. 10972번: 다음 순열 첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다. www.acmicpc.net #include #include using namespace std; int p[10000]; bool next_permutation(int *a, int n) { int i = n - 1; while ( i > 0 && a[i..
백준 알고리즘 기초 - 브루트 포스 (예제 + N과 M) 엄청 머리 아팠다.. 재귀 쪽에 감이 없는 건지, 잘 이해가 안 돼서 여러번 풀어봤다.. 정리하다보면 이해도가 더 높아지리라 기대하면서 정리 시작! - * 건너 뛰며 해보기 : 아무리 브루트 포스라도 경우의 수가 너무 많으면 다 해볼 수는 없다. 이때 규칙을 찾아서 건너 뛰면서 경우를 확인해주는 방법이다. 바로 예제 문제를 풀어보자. * 카잉 달력 (mid) : 전에 풀었던 달력 문제와 유사한데, 이번엔 제시된 날짜가 몇번째 해인지 구하는 문제다. 6064번: 카잉 달력 문제 최근에 ICPC 탐사대는 남아메리카의 잉카 제국이 놀라운 문명을 지닌 카잉 제국을 토대로 하여 세워졌다는 사실을 발견했다. 카잉 제국의 백성들은 특이한 달력을 사용한 것으로 알려져 있� www.acmicpc.net - 최소공배수를 ..
백준 알고리즘 기초 - 브루트 포스 새로운 챕터의 시작이다. 그냥 다 해보면 되는 줄 알았는데 그게 아니었다. 다 하는 방법도 생각을 잘 해야했다.. 브루트 포스 정리 시작 해본다! - * 브루트 포스 : 모든 경우의 수를 다 해보는 알고리즘. 단, 경우의 수를 다 해보는데 걸리는 시간이 문제의 시간 제한을 넘지 않아야 한다. - 문제 해결 단계 : 문제의 가능한 경우의 수 계산 -> 다 만들어 보기 -> 각각의 방법을 이용해 정답 구하기 - 시간 복잡도 : 대부분 경우의 수 * 방법 1개를 시도하는데 걸리는 시간으로 계산할 수 있음 예제를 한번 풀어보자. * 일곱 난쟁이(low) : 아홉 명의 난쟁이 중 키의 합이 100이 되는 일곱 명의 난쟁이를 찾는 문제다. 2309번: 일곱 난쟁이 아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주..