일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- directx
- 병행성 관련 오류
- 영속성
- 그리디 알고리즘
- 알고리즘
- 스케줄링
- 렌더링 파이프라인
- 자료구조
- 락
- 멀티프로세서
- OS
- 멀티쓰레드
- 동적계획법
- 쓰레드
- codility
- 디자인패턴
- 프로그래머스
- DirectX12
- DirectX 12
- 파일시스템 구현
- 운영체제
- 다이나믹 프로그래밍
- 컨디션 변수
- 병행성
- 그리디알고리즘
- 다이나믹프로그래밍
- 백준
- I/O장치
- 타입 객체
- Direct12
- Today
- Total
목록백준 (16)
기록공간

그리디 알고리즘을 사용하는 문제였다. 우선 나이트의 모든 이동방법이 위, 아래 오른쪽으로 무조건 1칸 이상 움직이므로, 세로 길이가 1인 체스판의 경우에 나이트는 한번도 이동 할 수 없다. 즉 세로가 1일때는 방문한 최대 칸 수는 1칸이다. 이제 이동 횟수가 4번 미만일 경우를 먼저 생각해보자. 이동 횟수가 4번 미만일 경우에는 이동방법에 제한이 없다는 것을 생각하고 다음을 살펴보자. 우선 세로 길이가 2인 체스판의 경우이다. (2 X 5) 최대로 방문할 수 있는 방법은 위 그림처럼 이동방법 2, 3번을 이용하여 가로 홀수 칸을 방문하는 방법이다. 이 방법을 사용하면 체스판의 가로 길이가 M이라고 했을때 나이트는 최대 (M + 1) / 2 칸을 방문할 수 있다. 하지만 위 규칙에 따라 이동횟수는 4번 미..

그리디 알고리즘을 사용하는 문제였다. 입력에서 키 정보와 자신보다 키가 큰 사람이 왼쪽에 몇 명이 있는지에 대한 정보가 주어진다. 그렇게 때문에 줄을 어떻게 서야 하는지에 대한 정보를 저장할 배열 result를 만들어 놓고 가장 작은 키의 사람부터 정보에 맞게 result에 키를 나열해주면 된다. 사람의 수는 10을 넘기지 않으므로 키의 범위는 1~10이 될것이다. 이 범위를 넘어가는 11을 빈자리로 선언하고 result를 빈자리로 채워넣는다. 위의 예제를 예로들어 설명하겠다. 사람 4명이 있으므로 result 배열의 크기는 4일 것이다. 둘째 줄 입력에 정보를 바탕으로 result에 줄의 순서를 배치해보자. 우선 키 1인 사람은 자기보다 키큰 사람이 왼쪽에 2명이 있다. 그러므로 자신의 키보다 큰 EM..

동적계획법을 사용하는 문제였다. 우선 점화식을 찾기 위해 규칙이 어떠한지 부터 살펴보자. P(1)~P(3)일때는 1로 모두 동일하다. 그리고 P(4)~P(5)일때 2이다. P(4)의 값은 P(1)과 P(2)를 더하여 2가 나오며, P(5)의 값은 P(2)와 P(3)을 더하여 2가 나온다. P(6)의 값은 P(3)과 P(4)를 더하여 3이 나온다. 이러한 규칙을 봤을때 점화식은 다음과 같을 것이다. P[N] = P[N - 3] + P[N - 2] 결과값이 int의 범위를 넘어가기 때문에 P(N)의 값을 저장할 dp 테이블 배열을 long long 형식으로 선언해주어야 한다. 코드는 다음과 같다. #include using namespace std; int main() { long long dp[100 + ..

동적 계획법을 사용하는 문제였다. 가장 긴 증가하는 부분 수열은 LIS라고 하며 이전에 자세하게 언급한 적이 있으므로 해당 게시글을 참조하길 바란다. https://lipcoder.tistory.com/50?category=843242 최장증가수열 - LIS(Longest Increasing Subsequence) LIS(최장증가수열)는 동적계획법으로 풀 수 있는 알고리즘 문제 중 하나이다. 어떤 임의의 수열이 주어졌을때, 이 수열에서 몇 개의 수들을 제거해서 부분수열을 만들수 있다. 이 때 만들어진 부분수열 중 오름차.. lipcoder.tistory.com 하지만 위와 다른 점이 있다면 위 문제의 경우는 중복되는 숫자가 있다는 점이다. 그것을 감안하고 풀면 되겠다. 코드는 다음과 같다. #includ..

동적 계획법을 이용하는 문제였다. 이전 문제였던 2xn 타일링과 비슷해 보이지만 2x2 타일이 추가되었다. 우선 2x2 타일을 추가하지 않은 경우 타일을 채우는 방법의 수를 점화식으로 표현하면 다음과 같다. 2xn 타일을 채울 방법의수 DP 테이블 배열 DP[N]이 있는 경우 DP[N] = DP[N - 1] + DP[N - 2] 하지만 2x2 타일이 추가되었기 때문에 세가지 사항을 고려해야 된다. 1. N - 1번째에서 2x1짜리 타일 한 개 붙이는 경우 2. N - 2번째에서 1x2짜리 타일 두 개 붙이는 경우 2. N - 2번째에서 2x2짜리 타일 한 개 붙이는 경우 그러므로 점화식은 DP[N] = DP[N-1] + 2 * DP[N-2]가 된다. 이는 DP[3]부터 적용되므로 그 밑의 값 DP[1],..

동적 계획법을 이용하여 해결하는 문제였다. 점화식을 찾기 위해 1부터 차례대로 구해보자. N = 1일 때는 1부터 9까지 모두 계단 수이다. (0은 계단 수가 아니라는 것을 명시했기 때문에 제외해야 한다) => 1, 2, 3, 4, 5, 6, ...., 9 이므로 N = 2일 때에는 계단 수는 다음과 같다. => 10, 21, 12, 32, 23, 43, 34, ...., 89 N = 2일 경우 계단 수에서 마지막 수를 잘 살펴보면 0 ~ 9까지 차례대로 나온다는 것을 알수 있고, 그 앞자리에는 +-1이 온다는 것을 알 수 있다. N = 2에서 마지막 수가 3일 경우 X3 (X에는 2와 4가 오기 때문에 N = 1에서 2와 4가 오면 된다.) 그러므로 23, 43이 계단수로 온다. N = 3에서 마지막 ..

동적 계획법을 사용하여 해결하는 문제였다. N번째에서 최대가 되는 연속합은 두가지 경우가 있다. 1. N-1번째의 연속합과 N번째 값을 더한 것 2. N번째 값 (N번째 부터 연속합을 구하는 경우) 이 두가지 경우를 점화식으로 만들면 다음과 같다. N번째의 연속합을 기록할 DP테이블 배열 DP[N+1](인덱스 접근시 0부터 시작하므로)과 해당 번째의정수를 기록할 배열 num[N+1]이 있다고 했을때, 첫번째 경우는 DP[N] = DP[N-1] + num[N]이고, 두번째 경우는 DP[N] = num[N]이 된다. 이 둘중 가장 큰 값이 DP[N]에 알맞는 연속합 값이 된다. 1번째 부터 마지막 번째 까지 알맞는 DP값을 기록한 후 DP 배열 중 가장 큰 값이 이 문제의 결과값이 된다. 주의할 점은 음수가..

동적 계획법을 사용하여 해결하는 문제이다. 연속으로 놓여있는 3잔을 마실 수 없기 때문에 세가지 경우가 도출된다. N개의 와인잔이 있다고 가정했을때, 처음부터 N번째 까지 차례대로 최대로 마신 양을 기록한다고 하자. N번째 와인잔에서는... 1. 해당 번째 와인을 마시지 않는 경우 : 그러면 이전 와인에서 최대로 마신 양이 된다. 2. 해당 번째 와인을 마시고 이전이전 와인을 마시는 경우 : 그러면 이전이전 와인에서 최대로 마신 양과 N번째 와인의 양의 합이다. 3. 해당 와인을 마시고 이전 와인을 마시고, 3잔 이상인 경우, 연속으로 놓여있는 3잔을 마실 수 없기 때문에 이전이전이전 와인을 마신다 : 이전이전이전 와인에서 최대로 마신 양과 이전 와인와 양 그리고 N번째 와인의 양를 모두 더한다. 이제 ..