목록코딩 (29)
tony9402
SCCC 스터디 8일차 1月 22日 그리디도 어렵다..그리디는 Greedy로 탐욕 알고리즘이라 불린다. 현재 선택이 나중 선택에 영향을 미치지 않게 고르는 것이다.디피랑 그리디에 대한 자세한 개념은 라이님 블로그, 나동빈님의 블로그에 잘 설명 되어있으니 거기서 개념을 보는게 좋다. (난 여기에 쓰는건 그냥 간단히 일기장처럼 쓰는 것이여서 개념보단 문제 리스트를 올리는 것이다.) 그리디 알고리즘의 종류가 있다. (여기서 내가 아는건 거.....의 없다....) 1. Fractional Knapsack Problem (=> 거스름돈 문제)2. 시간표 배정3. 수학적 성질이 최적해를 보장하는 경우4. Huffman Code5. 다익스트라6. MST(Kruskal, Prim)7. 최대 유량 1. 동전 0 - ●..
SCCC 스터디 7일차 1月 21日 DP 어려워;;;;;;;; 1. DP1 DP는 다이나믹 프로그래밍의 약자로 한국말로 하면 동적계획법이라 한다. (DP가 부르기 좋은 듯) 처음에 디피가 뭔지도 모르겠고 그냥 "어렵다"라는 말만 들어서 접근하기가 매우 힘들었다. 근데 맨 처음 풀 때 삽질과 다른 사람이 푼 방식을 보고 대충 어떤 느낌인지 깨닫기 시작했다. - 중복계산을 피해 한번 계산 했던 것은 저장해서 처리속도를 높인다. - 큰 문제를 해결하기 위해 작은 문제를 이용(이전 작업을 이용)하여 큰 문제를 해결 - 점화식을 이용해 문제 해결 첫 번째에 쓴 건 많이 들어봤을 것이다. (메모이제이션, memoization)두 번째는 분할정복과 비슷하다는 것을 느낄 수 있다.세 번째에는 점화식을 세워 풀면 된다는..
문제 : 1로 만들기문제 유형 : 다이나믹 프로그래밍 이 문제의 핵심은 입력 받은 수를 최소 횟수로 1로 만드는 것이다. 1. X가 3으로 나누어 떨어지면, 3으로 나눈다.2. X가 2로 나누어 떨어지면, 2로 나눈다.3. X에서 1을 뺸다. 위 세가지를 이용해서 1로 만들어야 하는데 이를 어떻게 할까? 다이나믹 프로그래밍 문제를 풀 땐 너무 복잡하게 생각하면 오히려 안풀린다. 다이나믹 프로그래밍 문제를 풀기 위한 방법은 탑다운 방식과 바텀업 방식이 있다. 나도 공부하는 입장이니 두 가지 방법으로 설명하겠다. 1. 탑다운(Top-down) 방식 현재 수를 X라 하자. X가 3으로 나눠떨어진다면 X/3을 만드는 횟수는 X 만든 횟수에 한번더 연산을 한 것이기 때문에 X를 만든 횟수에 +1을 해주면 된다.이..
문제 : 파도반 수열 문제 유형 : 다이나믹 프로그래밍 이 문제는 규칙을 찾기만 하면 되는 문제이다. 난 두가지 점화식으로 풀었다. 1. 점화식1 일단 가장 먼저 풀었던 방식을 설명하자면, 소용돌이처럼 이어지는 수를 한 줄로 써보았다. 1 1 1 2 2 3 4 5 7 9 12 ... 이것을 보고 규칙이 바로 보였다. 지금 현재 위치에서 왼쪽으로 2칸 떨어진 것과 같은 방향으로 3칸 떨어진 것의 합이 현재 위치의 값과 같다는 점화식을 발견했다. 이를 식으로 쓰자면 아래와 같다. 이 식을 가지고 초기값만 잘 넣어주면 쉽게 맞추는 문제이다. 또한 n이 커지면 int형의 범위가 벗어나니 맞왜틀 했던 사람들은 int를 long long으로 바꿔보기 바란다. - 소스코드 123456789101112131415161..
Visual Studio Code 설치하기 1. Visual Studio 홈페이지 접속하기 Visual Studio Code를 설치하기 위해 홈페이지에 접속하자. 밑에 빨간 네모칸으로 되어있는 부분을 누르면 된다. 누르면 아래와 같은 창이 뜨는데 조금만 기다리면 어떤 창이 뜰 것이다. 만약 10초 이상 기다렸는데 아무 창이 안뜨면 Download 버튼을 누르자. 아래와 같이 창이 떠야 정상이다. 2. Visual Studio Code 설치하기 설치파일을 다운 받았으면 실행을 시키자. 아래 사진들은 내가 설치한 방법이다. (중간에 자기가 원하는 대로 해도 문제가 없을 것이다.) 3. Visual Studio Code에서 Python 설치 아래와 같은 순서대로 따라하면 된다. 거기에 Python이라고 치면 ..
문제 : 1,2,3 더하기 6유형 : 다이나믹 프로그래밍 이 문제는 1,2,3 더하기 4, 5보단 조금 더 쉽고 재밌었던 문제였다.더하기 식이 대칭이 되도록 만들면 되는 문제이다. 이를 어떻게 풀지 고민하다가 다이나믹 프로그래밍이므로 재귀적으로, 또한 합이 대칭을 만족해야 한다는 요점을 잡고 다시 보니 바로 눈에 보였다. 어떤 수 x가 있는데 이를 어떻게 대칭적이고 재귀적으로 풀 수 있을까?바로 x에서 2, 4, 6을 빼고 반을 나눠 양쪽에 이어서 붙이면 된다.ex) x => 1 + (x-2) + 1, 2 + (x-4) + 2, 3 + (x-6) + 3 이렇게 빼면 된다. 근데 여기서 궁금증을 가지는 사람이 있을 수 있다.ex) 4를 1 + 1 + 1 + 1로 만들 수 있는데 이는 어떻게 만들어지지.....
문제 : 1,2,3 더하기 5문제 유형 : 다이나믹 프로그래밍 일단 정수 4인 경우, 1,2,3의 합으로 나타내는 방법이 왜 3개인지 알아보자. 처음엔 1,2,3의 합으로 나타낼 수 있는 모든 경우의 수를 구해보면 아래와 같다. 3 + 11 + 32 + 22 + 1 + 11 + 2 + 11 + 1 + 21 + 1 + 1 + 1 여기서 문제 조건에 만족하지 않은 것은 2 + 2와 1 + 1 + 1 + 1, 2 + 1 + 1, 1 + 1 + 2이다.이를 어떻게 풀까.......? 정수 n이 있다고 가정해보자. n은 아래와 같이 쓸 수 있을 것이다. 1. 3 + (n - 3)2. 2 + (n - 2)3. 1 + (n - 1) 1번에서 n - 3이 3이 아닌 1과 2로 식을 전개하면 된다.3 + 1 + (n -..
문제 : 1,2,3 더하기 4 문제 유형 : 다이나믹 프로그래밍 이 문제는 1,2,3 더하기로 표현하는 것들 중에서 더하기 순서를 바꿨을때랑 같은 것을 한 종류로 보는 문제이다. 4를 가지로 예를 들어보자. 4를 1,2,3더하기로 표현해보면 3+1 2+2 1+3 2+1+1 1+2+1 1+1+2 1+1+1+1 이렇게 7가지가 있는데 더하기 순서를 바꾸면 같아지는것을 묶어보자. 3+1 (1+3) 2+2 2+1+1 (1+2+1, 1+1+2) 1+1+1+1 이렇게 4가지가 있다. 이것을 어떻게 수식으로 표현할까? 1,2,3 더하기 시리즈 문제는 모두 다이나믹 프로그래밍으로 풀 수 있다. 이를 재귀적으로 생각해보면 점화식이 보인다. 한 종류로 만들 때, 여러가지 순서 중 비오름차순으로 짜면 된다. 4를 가지고 예..
알고리즘 분류 : 다이나믹 프로그래밍 문제 : 1,2,3 더하기 3 위 문제는 1, 2, 3 더하기 문제에서 n의 범위가 더 커졌고 모듈러 연산을 하면 되는 문제이다.따라서 이 문제는 여기에서 세운 점화식에다가 모듈러 연산만 추가 하면 된다. 1234567891011121314151617181920212223242526272829#include long long dp[1000001] = {0, 1, 2, 4 }; const long long mod = 1000000009; long long DP(int n){ if (n
알고리즘 분류 : 다이나믹 프로그래밍 문제 : 1,2,3 더하기 2 이 문제는 1,2,3 더하기 문제를 이용해서 풀었다. 먼저 4를 본다고 하면 DP[3] + DP[2] + DP[1]를 더한게 DP[4]의 값이다. 아래 그림을 보며 이해를 하자. 4는 3 + 1, 2 + 2, 1 + 3인 경우의 수를 알 수 있고 이를 사전 순으로 정렬하면 1 + 3, 2 + 2, 3 + 1이렇게 된다. 따라서 4를 간단한 규칙으로 정리하면 1부터 DP[4-1]까지는 1로, DP[4-1] + 1부터 DP[4-1] + DP[4-2] 까지는 2로, DP[4-1] + DP[4-2] + 1부터 DP[4-1] + DP[4-2] + DP[4-3] 까지는 3으로 채워진다. 이런 방식으로 계산을 하면 원하는 구간에서 값을 계속 vect..