회사에서 Go를 주 언어로 밀고 있고, 배정받은 팀에서도 Go로 개발을 진행하고 있기에 Go 언어를 학습하기 시작했다. 그러던 중 Goroutine을 마주치게 되었다. Goroutine이란? 고루틴은 Go 언어의 동시성 프로그래밍을 가능하게 해주는 경량 스레드이다. 좀더 쉽게 풀어서 얘기하면, 가벼운 스레드라고 생각하면 된다. Multi Thread와 Goroutine의 차이 멀티 스레드와 고루틴은 모두 '병행성(Concurrency)'을 위한 기술이지만, 몇가지 차이점이 존재한다. 첫째로, 스레드는 OS 수준에서 관리되며, 많은 자원을 사용하여 생성하고 관리된다. 반면 고루틴은 Go 언어 런타임에서 관리되기에 더 적은 메모리를 사용한다. 두 번째로, 스레드는 OS에서 스케줄링 되어 작업을 수행한다. 반..
Promise의 목적 Promise는 JavaScript를 사용하면 마주치게 되는 콜백지옥 문제를 해결하기 위해 등장했다. Promise는 비동기 연산이 종료된 이후, 연산의 결과 값이나 실패에 대한 처리기를 연결할 수 있는데, 비동기 메서드가 마치 동기 메서드처럼 값을 반환하는 것처럼 사용할 수 있다. 다만 최종 결과를 반환하는 것이 아니고, 미래의 어떤 시점에 결과를 제공하겠다는 '약속'을 하는 것처럼 사용한다. async function calculate(flag: boolean, successCallback: any, failureCallback: any) { if (flag) { successCallback(); } else { failureCallback(); } } function succe..
소프트웨어에서 이름은 어디나 쓰인다. 우리는 변수에도 이름을 붙이고, 함수에도 이름을 붙이고, 소스 파일이 담긴 디렉토리에도 이름을 붙인다. jar 파일에도 이름을 붙이고 war 파일에도 이름을 붙이고.. 여기저기 이름을 사용한다. 이렇듯 이름을 잘 지으면 여러모로 편하다. 이 번에는 이름을 잘 짓는 간단한 규칙을 몇가지 배우게 된다. 의도를 분명히 밝혀라 의도가 분명한 이름은 매우 중요하다. 좋은 이름을 지으러면 시간이 걸리지만, 좋은 이름으로 절약하는 시간이 훨씬 더 많이 소요되고 코드를 읽는 사람이 좀 더 행복해질 수 있다. 변수나 함수 그리고 클래스 이름은 다음과 같은 굵직한 질문에 모두 답해야 한다. 변수의 존재 이유는? 수행 기능은? 사용 방법은? 만약 따로 주석이 필요하다면 의도를 분명히 드..
원초적 난제 프로그래머는 근본적인 가치에서 난제에 봉착한다. 개발을 어느정도 해봤다면 누구나 나쁜 코드가 업무 속도를 늦춘다는 사실을 익히 안다. 그럼에도 모든 프로그래머가 기한을 맞추려면 나쁜 코드를 양산할 수 밖에 없다고 느낀다. 간단히 말해 빨리 가기 위해 시간을 들이지 않는다. (뜨끔1) 진짜 전문가. 정말 실력있는 개발자라면 두번째 부분이 틀렸다는 사실을 잘 알고 있다. 나쁜 코드를 양산하면 기한을 맞출 수 없다. 오히려 엉망진창인 상태로 인해 속도가 곧바로 늦어지고, 결국 기한을 놓치게 된다. 그래서 기한을 맞추는 유일한 방법은, 언제나 코드를 깨끗하게 유지하려는 습관이다. 깨끗한 코드? 나쁜 코드가 심각한 장애물이라는 사실을 납득했다고 가정해보자. 빨리 서비스를 만들려면 코드를 깨끗하게 유지..
간단한 그래프 탐색 문제이다. 문제를 해석해보면, 직관적으로 펭귄과 가장 가까운 빨간 블록 2개를 찾고, 이 2개의 블록을 찾기까지 만나는 깰 수 있는 블록들의 개수를 세면 된다. 이게 가능한 이유는 그래프가 트리로 주어지고, 빨간 블록들이 서로를 찾으려면 무조건 펭귄을 지나야 하기 때문이다. 따라서 BFS나 DFS를 돌려 각 칸에 도달하기 까지 거리를 구하고, 1 > N >> S >> P; for (int i=1; i> x >> y; adj[x].push_back(y); adj[y].push_back(x); } visited[P] = 0; dfs(P); priority_queue pq; for (int i=1; i
일단 다익스트라 응용 문제인 것은 간단하게? 눈치챌 수 있다. 문제를 해석해보면, 아줌마는 총 10개의 노드를 순차적으로 이동한다고 한다. 여기서 문제의 핵심은 무조건 이 순서대로 이동한다는 것이다. 문제에서 주어지는 '나'의 순서는 필요없다. 그냥 모든 노드를 이동할 수 있고, 야쿠르트 아줌마를 만날 수 있는 노드가 몇번인지?를 구해야 한다. 아줌마가 이동할 노드들이 주어진다. 이때 각 노드별로 다익스트라를 돌려보자. 어차피 10번만 돌리면 되기 때문에, 10번의 다익스트라로 아줌마가 이동할 경로의 모든 최솟값 경로를 구할 수 있게 된다. 이제 나를 기준으로 다익스트라를 돌려주자. 내가 모든 노드에 도달할 수 있는 최소 비용을 구했다면, 이제 아줌마의 경로를 따라가봐야 한다. 아줌마가 i, i+1, i..
우선순위 큐 두개로 해결할 수 있는 문제이다. recommend 명령어가 1인지, -1인지에 따라 큰 값부터, 작은 값부터 찾아야 하는 값이 달라진다. 그래서 최대 힙과 최소 힙을 함께 사용하면 된다는 것을 눈치챌 수 있다. 그리고 별도의 방문 배열을 만들어서 각 문제가 solved 된 적이 있는지 확인하기로 하자. 그러면 최대힙에 있는 문제가 해결되었을때, 최소힙에서 이를 판별할 수 있게 된다. 구현이 조금 귀찮았던 문제다. #include #define MINF 0x7f7f7f7f #define INF 2000000000 #define MOD 10007 #define NUM 200010 #define X first #define Y second using namespace std; typedef lo..
스택으로 해결할 수 있는 문제이다. 현재 건물의 높이를 기준으로, 왼 오른쪽을 전부 바라봤을때 볼 수 있는 건물의 개수를 세라고 한다. 앞에서 부터 값을 저장한 스택과 뒤에서 부터 값을 저장한 스택을 사용하면 각 칸별로 바라볼 수 있는 건물의 개수를 구할 수 있다. 그다음 구해야 하는 것은 가장 가까운 건물의 번호이다. 가까운 건물의 번호는 스택으로 볼 수 있는 건물을 셀때 약간의 조건문을 통해 갱신하면 된다는 것을 쉽게 알아챌 수 있다. 스택을 갱신할 때마다 건물과 거리를 갱신하자. 그리고 이 번호가 갱신되는 순간 건물의 번호를 갱신해주면 된다. #include #define MINF 0x7f7f7f7f #define INF 2000000000 #define MOD 10007 #define NUM 10..
- Total
- Today
- Yesterday
- algorithm
- fiber
- soft delete
- cs
- ARP
- go
- effective
- GORM
- Operating System
- spring
- network
- mmu
- 공지
- Database
- java
- OS
- Effective Java
- paging
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |