본문 바로가기

알고리즘/백준 알고리즘 강의

(40)
백준 알고리즘 기초 - 브루트 포스 (비트마스크) 브루트 포스 마지막 파트다. 여러모로 쓸모 있는 스킬이지만, 특정 문제에만 적용되고, 속도가 좀 느리다는 단점이 있다. 그래도 정리 해뒀다가 잘 써먹자. 정리 시작! - * 비트마스크 : 비트 연산을 사용해서 부분집합을 표현할 때 사용한다. - 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번: 일곱 난쟁이 아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주..
백준 알고리즘 기초 - 다이나믹 프로그래밍 (도전) 난이도가 높은 새로운 문제를 풀줄 알았는데, 기존의 문제를 좀 더 어려운 방법으로 풀거나 조건을 더 추가해서 푸는 식이었다. 새로운 문제를 푸는 것 보다 훨씬 와닿는 도전이었다. '이걸 이렇게 더 빨리 풀 수 있구나' 하는 깨달음도 얻었다. 벌써 dp 챕터의 마지막 강의다.. 정리 시작 해보자! - * 동물원 (high) : 2차원으로 풀던 걸 1차원으로 풀었다. 배열을 어떻게 정의하느냐가 관건이다. 1309번: 동물원 첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다. www.acmicpc.net - 기존에는 d[i][j]로 두고, i번째 줄에 j 경우일 때까지의 경우의 수로 생각했는데, 이번엔 일차원 배열로 생각해본다. - d[i]를 i번째에 동물이 무조건 들어가 있는 i번째까지의 경우의 ..
백준 알고리즘 기초 - 다이나믹 프로그래밍 (연습) dp가 정말 풀 것 같으면서도 잘 안 풀린다. 계속 고민하다가.. 해답 보고 실소 짓고 풀고.. 또 고민하다가.. 해답 보고 실소 짓고 풀고.. 반복.. 감각을 키우는 것 외에는 답이 없는 것 같다. 그래도 어느정도는 감을 잡은듯 싶다. 하지만 또 뒤돌면 못 풀 것 같은 녀석이다. 푼 것들 정리 해보자 - * 1, 2, 3 더하기 3 (low): 하던 것처럼 맨 끝을 나눠서 생각해보자 15988번: 1, 2, 3 더하기 3 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 1,000,000,009로 나눈 나머지를 출력한다. www.acmicpc.net 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2..
백준 알고리즘 기초 - 다이나믹 프로그래밍 (예제2) 어렵다.. dp.. 근데 중요한 건.. 더 어려운 놈들이.. 기다리고 있다는 것... 생각보다 시간이 더 걸릴 것 같다.. 그만큼 확실하게 짚고 넘어가자..! 예제2 정리 시작! - * 가장 긴 증가하는 부분 수열(mid): LIS라고도 불리는 유명한 문제다. 기억해뒀다가 필요할 때 써먹자. 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21..