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

그리디 알고리즘을 사용하는 문제였다. 우선 물이 새는 곳의 위치를 입력받으면 그 정보를 정렬한다. 그 다음 처음 물이 새는 곳의 위치를 기록한다.(start값) 물이 새는 곳이 하나라도 있으면 테이프를 한 개는 써야 하므로 테이프의 갯수를 기록할때는 1부터 시작한다. 테이프를 최소로 쓰기 위해서 어떻게 해야 하는지 살펴보자. 물이 새는 위치를 순회하며 start에서 물이 새는 위치까지의 길이가 테이프의 길이 - 1(좌우 0.5만큼 간격을 줘야 하므로) 보다 큰 경우 이미 테이프의 길이를 넘어 갔으므로 start부분만 막고 새로운 테이프로 현재 위치를 막아야 한다. 그리고 start값을 현재 위치의 값으로 갱신한다. 모든 위치를 방문했을때 테이프의 갯수가 우리가 원하는 값이 된다. 코드는 다음과 같다. #..

우선 입력받은 추의 무게를 오름차순으로 정렬해야 한다. 정렬된 상태에서 맨 처음 추의 무게가 1이 아닌 경우에 측정할 수 없는 최소 무게는 1이다. 만약 맨 처음 추의 무게가 1인 경우 1을 시작으로 두번째 추부터 마지막 추까지 무게를 차례대로 더해주도록 한다. 무게가 적은 추부터 차례대로 더하는 sum이라는 값이 있다고 하자. 차례대로 sum에 추의 무게를 더해주는 도중에 sum + 1이면서 sum + 1값이 입력받은 어떤 추에도 존재하지 않는 값이라면 그것은 측정할 수 없는 최소 무게가 될것이다. 코드는 다음과 같다. #include #include #include using namespace std; int main() { int N; cin >> N; vector sinkers; for (int ..

그리디 알고리즘을 사용하는 문제였다. 우선 나이트의 모든 이동방법이 위, 아래 오른쪽으로 무조건 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에서 마지막 ..