전체 글
[BOJ] 1463 1로 만들기 - 메모이제이션
[BOJ] 1463 1로 만들기 - 메모이제이션
2022.01.13매우 간단한 문제이다. 나눗셈을 하는것이 무조건 이득이다. 75를 예로 들어보자 75 는 2^3 * 3 ^ 2 + 3 이다. 결국 몇으로 나눌지가 문제이다 이것을 재귀적으로 분기 할 수 있도록 식을 구성한다. 반복되는것이 있을 수 있으므로 메모리에 저장해둔다. #include #include #include int Memoization[1000001] = { 0 , }; int RecCalc(int Number) { if (Number < 2) return 0; int Select2 = 0; int Select3 = 0; if (0 != Memoization[Number]) return Memoization[Number]; if (0 != Memoization[Number / 3]) Select3 = M..
[BOJ] 2579 계단 오르기 - 동적계획법
[BOJ] 2579 계단 오르기 - 동적계획법
2022.01.13어떠한 인덱스 N에 도착하기 위한 경우의 수는 두가지 밖에 없다. 두칸 전에서 두칸을 뛰어 오르던지, 한칸전에서 한칸을 뛰어 오르던지. 근데 두칸을 올라서 굳이 한칸을 빼먹어야 될 일은 없다. 그래서 무조건 한칸씩 계속 오르면 최대값이다. 다 올라간게 무조건 최대값이다. 이건 문제가 되질 않는다. 그래서 문제에선 세칸이 연속되면 안된다는 조건을 건다. 두칸전에서 두칸을 뛰어 오르는 경우를 생각해보자. 이건 단순히 N - 2 번째 칸까지의 최대값에서, N 칸을 밟은 거다. 두칸을 올라온 거니 따로 제약사항이 없다.MAX(N) = MAX(N-2) + COST(N)이 나온다. 한칸전에서 한칸을 뛰어 오르는 경우를 생각해보자. 여긴 조건이 있다.따라서 패턴을 강제시킨다. N - 1 번째 칸에서 한칸을 뛰어 올랐..
Windows OS - 스레드(Thread) 1편
Windows OS - 스레드(Thread) 1편
2022.01.12아주 기본적인 스레드의 개념. '프로세스는 왜 존재하는가' 를 생각해본다.왜 존재하는가? 간단하다. 프로세스는 프로그램 실행을 위해 존재한다. 프로그램 실행은 어떻게 이루어지는가? 프로그램은 명령어의 집합이다. 기계어 명령어를 파일로 만들면 그게 우리가 실행파일이라고 부르는것이 된다. 기계어 명령어가 CPU로 전달되면 CPU는 그것을 이해하고 실행한다. 이게 프로그램의 실행이다. 아무튼, 프로세스는 프로그램 실행을 위해 존재한다고 했다. 여기서 스레드라는 개념이 등장한다. 스레드라는 개념은 프로세스의 개념보다는 비교적 늦게 등장했다. 프로세스가 가지는 프로그램 실행의 개념을 스레드에게 100% 이식했다. 간단한 비유를 하자면 부서가 분리된 것이다. 이 스레드라는 것이 프로그램을 실행한다. 프로세스와 스레..
[BOJ] 1932 정수 삼각형 - 동적 계획법
[BOJ] 1932 정수 삼각형 - 동적 계획법
2022.01.10매우 간단한 문제이다. 아래층으로 값을 더하고, 거기 기록한다. 어떠한 인덱스에서 갈수있는 아래층 원소의 인덱스를 구하기 위해서는 현재 인덱스와 내가 속한 레이어의 번호를 더해주면 쉽게 구할수 있다. 인덱스 2는 4와 5로 접근 가능하고, 인덱스 3도 5에 접근 가능하다. 자연스럽게 최대값이 구해진다. 레이어를 하나씩 증가시키면서 원소 개수만큼 루프를 돌리며 바로 다음 레이어의 최대값을 계속 구해주다 보면 원하는 값을 구할 수 있다. 코드로 구현한 결과는 다음과 같다. #include int MaxResult[125251] = { 0 , }; int Cost[125251] = { 0 , }; int main() { std::cin.tie(0); std::cin.sync_with_stdio(false); ..
Winsock/C++ - IOCP 종료처리 관련
Winsock/C++ - IOCP 종료처리 관련
2022.01.101. closesocket 이후에 OS는 closesocket 의 인자로 전달했던 것과 같은 값을 가지는 핸들을 리턴할 수 있다. closesocket은 TCP 단에서의 연결종료 루틴의 수행 뿐 아니라 핸들을 반납하는 역할 또한 수행한다. closesocket이후 OS는 같은 핸들을 반환할 수 있는데, IOCP의 경우 멀티스레드로 사용하는 경우가 대부분이기 때문에 동기화 문제가 발생할 가능성이 크다. 따라서, closesocket을 두번이상 호출하는 것은 위험성을 가지며, closesocket을 호출하기 전에는 해당 소켓 핸들에 더이상 접근이 없음을 확실시 해야 한다. 2. 1Recv 1Post 가 가장 보편적이고 가장 편리하고 가장 깔끔하다. (수신하고 - Post 를 반복한다.) 수신에 대한 완료 통..