본문 바로가기

알고리즘

(43)
백준 알고리즘 기초 - 다이나믹 프로그래밍 (도전) 난이도가 높은 새로운 문제를 풀줄 알았는데, 기존의 문제를 좀 더 어려운 방법으로 풀거나 조건을 더 추가해서 푸는 식이었다. 새로운 문제를 푸는 것 보다 훨씬 와닿는 도전이었다. '이걸 이렇게 더 빨리 풀 수 있구나' 하는 깨달음도 얻었다. 벌써 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..
백준 알고리즘 기초 - 다이나믹 프로그래밍 (예제1) DP는 정말 문제 푸는 감각이 중요한듯. 알면 너무 쉽고, 모르면 진짜 어렵다. 많이 풀어보자. 예제 푼 것들 정리! - * 카드 구매하기 (mid): 주어진 카드를 최댓값으로 구매하는 경우를 구하는 문제다. 11052번: 카드 구매하기 첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000) 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 #include #include using namespace std; int p[10001]; int d[1001]; int main()..
백준 알고리즘 기초 - 다이나믹 프로그래밍 1 + 기초 예제 풀 수 있을 것 같지만, 못 풀 것 같기도 한 알고리즘.. dp.. 그만큼 제대로 된 이해를 못 하고 있다는 거겠지..? 이번 기회에 확실하게 짚고 넘어가자. 다이나믹 프로그래밍 정리 시작! - * 다이나믹 프로그래밍 (DP): 큰 문제를 작은 문제로 나눠서 푸는 알고리즘 (큰 문제를 작은 문제로 나눠서 푸는 알고리즘은 2가지가 있는데 하나가 DP, 하나는 분할 정복 알고리즘(D&C)이다. DP는 나눈 문제들이 중복이 가능하지만, D&C는 중복이 될 수 없다는 차이가 있다.) - 두 가지 속성을 만족해야 DP를 사용할 수 있다. 1. Overlapping Subproblem : 큰 문제와 작은 문제를 같은 방법으로 풀 수 있어야 하고, 문제를 작은 문제로 쪼갤 수 있어야 한다. 2. Optimal Sub..
백준 알고리즘 기초 - 수학1 (연습) 수학 1 연습 해보자 - - GCD 합 (low): 이중 for 문으로 묶어서 더하면 되는 간단한 문제였다. 9613번: GCD 합 문제 양의 정수 n개가 주어졌을 때, 가능한 모든 쌍의 GCD의 합을 구하는 프로그램을 작성하시오. 입력 첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 �� 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 28 29 30 31 32 33 34 35 36 37 38 #include using namespace std; int gcd(int x, int y) { while (y != 0) { int r = x%y; ..
백준 알고리즘 기초 - 수학1 굉장히 유용한 챕터였다. 예전부터 관련된 문제를 해결하는 것은 어렵지 않았는데, 세련되지 않게 푸는 느낌이 들 때가 많았다. 다른 방법이 있을 것만 같은 느낌이 강하게 들었는데, 이번 챕터로 그 찝찝함을 해결한 느낌이 들어서 기분이 좋다. 아리까리 할 때 자주 찾을 것만 같은, 수학1 정리 시작! - * 나머지 연산: 답이 엄청 커질 때, 어떤 수로 나눈 나머지를 답으로 요구하는 경우가 있다. 결과값의 나머지를 바로 구할 수도 있지만 그게 너무 커져버리면 오버플로우가 나서 계산을 못 하는 경우도 생긴다. 그런 일이 안 생기게 계산 과정에서 나머지 연산을 해주는 방법이 있다. - (a+b) mod M = ( (a mod M) + (b mod M) ) mod M - (a*b) mod M = ( (a mod ..
백준 알고리즘 기초 - 자료구조1 (연습) 문제 풀이 강의라서 강의를 듣기 전에 먼저 문제를 풀었다. 어떻게 풀었냐에 따라 3가지 기준으로 표시를 남겨서, 나중에 복습할 때 활용하고자 한다. low: 솔루션이 떠올라서 답을 풀었다. mid: 솔루션이 떠오르지 않아 강의를 참고해 답을 풀었다. high: 솔루션이 떠오르지 않아 강의를 봤는데도 아리까리 해서 정답 코드를 참조했다. + 그리고 스스로에게 다시 한번 당부. 방법론은 이해 했으나 사소한 실수로 인한 런타임 에러 등으로 시간 낭비를 할 필요는 굳이 없는 것 같다. 차근차근 체크를 해도 도저히 영문을 모르겠다 싶으면 그냥 정답 코드를 참고하고, 다시 풀어보도록 하자. 연습문제 정리 시작! - * 단어 뒤집기2 (low): 단어 뒤집기 업그레이드 버전. 괄호 안의 단어는 안 뒤집는 조건이 추가..