분류 전체보기 153

[Summary] 게임 서버 프로그래밍 교과서 - Ch1

공지사항 본 글은 배현직 저자님의 게임 서버 프로그래밍 교과서를 읽고 썼습니다. 본 글은 저자님의 요청으로 언제든지 지워질 수 있습니다. 멀티스레드 프로그래밍 멀티스레드 프로그래밍이 필요한 때 멀티스레드 프로그래밍이 필요한 경우는 다음과 같다. 오래 걸리는 일 하나와 빨리 끝나는 일 여럿을 같이 해야 할 때 e.g. 게임 프로그램에서의 로딩 어떤 긴 처리를 진행하는 동안 다른 짧은 일을 처리해야 할 때 e.g. 디스크에 액세스할 때 기기에 있는 CPU를 모두 활용해야 할 때 멀티스레드 프로그램 작성 시 고려사항 단순히 스레드를 만든다고 하여 멀티스레드 프로그램이 되는 것은 아니다. 스레드를 다룰 때는 문맥 교환(context switch)과 경쟁 상태(data race), 교착 상태(dead lock)를..

Outdated/Game 2019.06.12

[BOJ] 11661번 해의 개수

문제 방정식 Ax + By + C = 0의 해의 개수를 구하는 프로그램을 작성하시오. A, B, C, x, y는 모두 정수이고, x1 ≤ x ≤ x2, y1 ≤ y ≤ y2인 해의 개수를 구해야 한다. 입력 첫째 줄에 A, B, C, x1, x2, y1, y2가 주어진다. 모든 정수는 -108보다 크거나 같고, 108보다 작거나 같은 정수이다. 출력 첫째 줄에 입력으로 주어진 방정식의 해의 개수를 출력한다. 예제 // 입력 1 1 1 -20 20 -30 30 // 출력 41 // 입력 20 30 40 50 60 70 80 // 출력 0 // 입력 -100 20 300 -100 200 -2000 3000 // 출력 301 // 입력 -10 8 4 -100 100 -200 300 // 출력 50 코드 C++..

[BOJ] 11401번 이항 계수 3

문제 자연수 N과 정수 K가 주어졌을 때 이항 계수 bin(N,K)를 1,000,000,007로 나눈 나머지를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 4,000,000, 0 ≤ K ≤ N) 출력 bin(N,K)를 1,000,000,007로 나눈 나머지를 출력한다. 예제 // 입력 5 2 // 출력 10 코드 C++17 #include using namespace std; using LL = long long; constexpr LL M = 1'000'000'007; LL N, K; LL kFact, invOfkFact, numer; inline LL power(LL x, LL y) { LL toRet = 1; while (y > 0) { if (y & 1) t..

[BOJ] 1978번 소수 찾기

문제 주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오. 입력 첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다. 출력 주어진 수들 중 소수의 개수를 출력한다. 예제 // 입력 4 1 3 5 7 // 출력 3 코드 C++17 #include using namespace std; bool primes[1001] = { true, true }; int N, ans; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); // 에라토스테네스의 체 for (int i = 2; i N; for (int i = 0; i < N; ..

[BOJ] 2839번 설탕 배달

문제 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다. 상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다. 상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000) 출력 상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정..

[BOJ] 2455번 지능형 기차

문제 최근에 개발된 지능형 기차가 1번역(출발역)부터 4번역(종착역)까지 4개의 정차역이 있는 노선에서 운행되고 있다. 이 기차에는 타거나 내리는 사람 수를 자동으로 인식할 수 있는 장치가 있다. 이 장치를 이용하여 출발역에서 종착역까지 가는 도중 기차 안에 사람이 가장 많을 때의 사람 수를 계산하려고 한다. 단, 이 기차를 이용하는 사람들은 질서 의식이 투철하여, 역에서 기차에 탈 때, 내릴 사람이 모두 내린 후에 기차에 탄다고 가정한다. 내린 사람 수 탄 사람 수 1번역(출발역) 0 32 2번역 3 13 3번역 28 25 4번역(종착역) 39 0 예를 들어, 위와 같은 경우를 살펴보자. 이 경우, 기차 안에 사람이 가장 많은 때는 2번역에서 3명의 사람이 기차에서 내리고, 13명의 사람이 기차에 탔을..

[BOJ] 10835번 카드게임

문제 지훈이는 최근에 혼자 하는 카드게임을 즐겨하고 있다. 게임에 사용하는 각 카드에는 양의 정수 하나가 적혀있고 같은 숫자가 적힌 카드는 여러 장 있을 수 있다. 게임방법은 우선 짝수개의 카드를 무작위로 섞은 뒤 같은 개수의 두 더미로 나누어 하나는 왼쪽에 다른 하나는 오른쪽에 둔다. 그리고 빈 통을 하나 준비한다. 이제 각 더미의 제일 위에 있는 카드끼리 서로 비교하며 게임을 한다. 게임 규칙은 다음과 같다. 지금부터 왼쪽 더미의 제일 위 카드를 왼쪽 카드로, 오른쪽 더미의 제일 위 카드를 오른쪽 카드로 부르겠다. 언제든지 왼쪽 카드만 통에 버릴 수도 있고 왼쪽 카드와 오른쪽 카드를 둘 다 통에 버릴 수도 있다. 이때 얻는 점수는 없다. 오른쪽 카드에 적힌 수가 왼쪽 카드에 적힌 수보다 작은 경우에는..

[BOJ] 2098번 외판원 순회

문제 외판원 순회 문제는 영어로 Traveling Salesman problem (TSP) 라고 불리는 문제로 computer science 분야에서 가장 중요하게 취급되는 문제 중 하나이다. 여러 가지 변종 문제가 있으나, 여기서는 가장 일반적인 형태의 문제를 살펴보자. 1번부터 N번까지 번호가 매겨져 있는 도시들이 있고, 도시들 사이에는 길이 있다. (길이 없을 수도 있다) 이제 한 외판원이 어느 한 도시에서 출발해 N개의 도시를 모두 거쳐 다시 원래의 도시로 돌아오는 순회 여행 경로를 계획하려고 한다. 단, 한 번 갔던 도시로는 다시 갈 수 없다. (맨 마지막에 여행을 출발했던 도시로 돌아오는 것은 예외) 이런 여행 경로는 여러 가지가 있을 수 있는데, 가장 적은 비용을 들이는 여행 계획을 세우고자..

[BOJ] 2665번 미로만들기

문제 n×n 바둑판 모양으로 총 n2개의 방이 있다. 일부분은 검은 방이고 나머지는 모두 흰 방이다. 검은 방은 사면이 벽으로 싸여 있어 들어가 수 없다. 서로 붙어 있는 두 개의 흰 방 사이에는 문이 있어서 지나다닐 수 있다. 윗줄 맨 왼쪽 방은 시작방으로서 항상 흰 방이고, 아랫줄 맨 오른쪽 방은 끝방으로서 역시 흰 방이다. 시작방에서 출발하여 길을 찾아서 끝방으로 가는 것이 목적인데, 아래 그림의 경우에는 시작방에서 끝 방으로 갈 수가 없다. 부득이 검은 방 몇 개를 흰 방으로 바꾸어야 하는데 되도록 적은 수의 방의 색을 바꾸고 싶다. 아래 그림은 n=8인 경우의 한 예이다. 위 그림에서는 두 개의 검은 방(예를 들어 (4,4)의 방과 (7,8)의 방)을 흰 방으로 바꾸면, 시작방에서 끝방으로 갈 ..

[BOJ] 9020번 골드바흐의 추측

문제 1보다 큰 자연수 중에서 1과 자기 자신을 제외한 약수가 없는 자연수를 소수라고 한다. 예를 들어, 5는 1과 5를 제외한 약수가 없기 때문에 소수이다. 하지만, 6은 6 = 2 × 3 이기 때문에 소수가 아니다. 골드바흐의 추측은 유명한 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 소수의 합으로 나타낼 수 있다는 것이다. 이러한 수를 골드바흐 수라고 한다. 또, 짝수를 두 소수의 합으로 나타내는 표현을 그 수의 골드바흐 파티션이라고 한다. 예를 들면, 4 = 2 + 2, 6 = 3 + 3, 8 = 3 + 5, 10 = 5 + 5, 12 = 5 + 7, 14 = 3 + 11, 14 = 7 + 7이다. 10000보다 작거나 같은 모든 짝수 n에 대한 골드바흐 파티션은 존재한다. 2보다 큰 짝수..