전체 글 147

[BOJ] 9328번 열쇠

복기데이터를 때에 따라 확장하자. 코드C++ 17 #include #include #include using namespace std; struct Elem{ int H, W;}; int H, W, T; // 빌딩 밖도 탐색의 범위에 포함시켜// 프로그래밍의 편의성을 가져간다.// 다시 말해, 왼쪽 맵을 오른쪽처럼 생각한다.// **.* ......// *..* --> .**.*.// **** .*..*.// .****.// ...... char Map[102][102];bool Keys[26];bool IsVisited[102][102];int dh[] = { -1, 1, 0, 0 };int dw[] = { 0, 0, -1, 1 }; int bfs(){ int ans = 0; queue q; // 추후..

[BOJ] 2206번 벽 부수고 이동하기

복기전형적인 BFS 문제다. Python3에서 입력 받을 때, list comprehension을 쓰는 것보다 append() 하는 것이 좀 더 빠르게 나왔다. 코드C++ 17 #include #include using namespace std; struct Elem{ int R, C, hadDestructed;}; int N, M;char Map[1001][1001];int Dist[1000][1000][2]; int bfs(){ int dr[] = { -1, 1, 0, 0 }; int dc[] = { 0, 0, -1, 1 }; Dist[0][0][0] = 1; queue q; q.push({ 0, 0, 0 }); while (false == q.empty()) { auto [r, c, hadDestr..

[BOJ] 2042번 구간 합 구하기

복기세그먼트 트리 문제에 대표적인 문제다. 세그먼트 트리에 대해서는 이 문서를 참고하라. 노드의 의미를 어떻게 설정할지가 관건이다. 코드C++ 17 #include using ll = long long; #define MAX_N 1000000 size_t N, M, K;ll Arr[MAX_N + 1];ll Tree[MAX_N * 4]; // @Desc : Arr의 [s, e]의 합으로 세그먼트 트리를 초기화한다.// @Return : node의 값// @Param// node : 노드 번호// s : 범위의 시작// e : 범위의 마지막ll Init(size_t node, size_t s, size_t e){ // 단말 노드라면 if (s == e) Tree[node] = Arr[s]; // 단말 노드가..

[BOJ] 1437번 수 분해

복기처음엔 메모이제이션을 생각했는데, 수학 문제는 해당 수의 규칙성을 잘 발견해야겠다. 코드C++ 17 #include #define M 10007 using uint = unsigned; int main(){ uint n = 0; scanf("%u", &n); // N이 5 미만이라면 분해를 하지 않고 그대로 곱하는 것이 이득이고 // N이 5 이상이라면 3을 가능한 많이 곱하는 것이 이득이다. uint k = 1; while (n >= 5) { k *= 3; k %= M; n -= 3; } printf("%u", (n * k) % M);} C# 6.0 using System;using System.Diagnostics.CodeAnalysis; namespace Csharp{ class Program ..

[BOJ] 1937번 욕심쟁이 판다

복기- 코드C++ 17 #include #define Max(lhs, rhs) ((lhs) > (rhs) ? (lhs) : (rhs)) int N;int Map[502][502];int Memo[502][502]; // 각 좌표마다 며칠동안 생존 가능한지 메모이제이션한다. int Search(int r, int c){ if (Memo[r][c]) return Memo[r][c]; // 상 if (Map[r - 1][c] > Map[r][c]) Memo[r][c] = Max(Memo[r][c], Search(r - 1, c) + 1); // 하 if (Map[r + 1][c] > Map[r][c]) Memo[r][c] = Max(Memo[r][c], Search(r + 1, c) + 1); // 좌 if ..

[OS] 프로세스(process)와 스레드(thread)

목차프로그램프로세스스레드멀티 프로세스 vs 멀티 스레드참고자료1. 프로그램먼저 프로세스를 살펴보기 전에 프로그램(program)이 무엇인지 알아볼 필요가 있다. 본래 프로그램의 의미는 업무를 어떻게 수행할 건지에 관한 표였다. 다시 말해 어떤 작업을 하기 위해 해야할 일들을 순서대로 나열한 것이다. 컴퓨터에서의 프로그램의 의미도 비슷한데, 프로그램은 어떤 작업을 하기 위한 명령어 목록과 그에 필요한 데이터를 묶어 놓은 파일이며, 보조 기억장치에 저장되어 있다.2. 프로세스정의프로세스(process)의 정의는 다양한데 본질적으로는 위에서 설명한 프로그램이 실제로 메모리에 적재 되어(loaded) 실행되고 있는 인스턴스(instance)를 말한다. 다르게 얘기하면 운영체제로부터 시스템 자원을 할당 받는 작업..

Outdated/OS 2020.05.06

[BOJ] 1799번 비숍

복기체스판 문제는 흑과 백으로 나눠서 생각하도록 하자. 또, 말들의 범위를 검사할 때 메모리를 이용하는 방법도 고려해보자. 코드C++ 17 #define _CRT_SECURE_NO_WARNINGS #include #define max(a, b) ((a) > (b) ? (a) : (b)) int N;int Chess[10][10];int Ans[2]; // 아래 변수는 비숍의 범위가 겹치는지 나타내는 변수다.// 이 값이 1이면 다른 비숍과 범위가 겹쳐 거기에 위치시킬 수 없다.int Left[21]; // 좌하단 방향의 대각선int Right[21]; // 우하단 방향의 대각선 // 흑과 백을 구분하기 위한 변수int Criterion; void dfs(int r, int c, int cnt){ // 비..