Projects
개요 따릉이는 서울시에서 운영하는 공유자전거 서비스입니다. 따릉이의 이용자 수는 매년 빠르게 증가하고 있고 2021년 기준 가입자 330만명, 이용건수 3천 300만건입니다. 이는 서울시 인구 1/3이에 해당하며 이러한 증가 추세에 맞춰 서울시는 따릉이 사업을 확대하고 있습니다. 또한 따릉이는 친환경 이동수단으로 대중교통과의 환승을 도입하는 등 사용이 장려되고있는 사업입니다. 하지만 이러한 정책적 지원과 별개로 따릉이 사용의 편의를 위한 서비스는 부족하다고 생각됩니다. 프로따릉러는 따릉이 전용 경로 추천 시스템입니다. 따릉이 대여소 정보를 제공하며 경로 탐색 시 출발지와 목적지 주변 대여소를 기반으로 경로를 추천해줍니다. 서비스는 이곳에서 이용할 수 있습니다. 문제 현재 사용자가 따릉이를 이용할 때 경로..
개인 프로젝트를 진행하던 도중 데이터베이스의 쿼리 실행 시간을 비교할 필요가 생겼습니다. 쿼리 실행 시간 측정 기능을 제공하는 패키지가 당연히 있을 줄 알았지만 찾지 못했고 저와 같은 기능을 찾는 사람들이 많다는 것을 알게 되어 패키지로 제작하게 되었습니다. 패키지 제작 이유부터 중간에 했던 시행착오들을 포함한 패키지 제작과정을 기록해 볼까 합니다. ❗️이 글은 2022년 2월에 작성된 글을 블로그를 리뉴얼하며 다시 작성한 글입니다. 노드에서 MySQL 쿼리 실행 속도 측정 MySQL의 쿼리 실행속도를 노드에서 측정하는 법을 검색해 보면 아래와 같은 방법이 나옵니다. // 시작시간 var start = new Date().getTime(); // 쿼리 실행 connection.query(query, fu..
KaTeX Playground 블로그를 글에 수식을 적는 일이 많아 KaTeX를 자주 사용합니다. 매번 미리 보기로 확인하는 것이 번거로워 바로 수식을 확인할 수 있는 `KaTeX playground`를 제작했었습니다.(관련 글) 사용하면서 예전에 썼던 문법을 찾는 일이 잦았고 수식을 저장하는 기능을 추가 해야겠다는 생각이 들었습니다. 수식을 저장, 삭제, 복사하는 기능을 추가했고 저장한 수식을 URI를 통해 공유하는 기능도 추가했습니다. URI로 공유하기 때문에 다른 사람에게 보내기도 쉽고 URI만 클라우드에 적어두면 KaTeX Playground도 클라우드를 이용하는 것처럼 사용할 수 있습니다. 예시로 제가 작성한 수식을 공유하는 링크를 올려봅니다. 사이드바에서 저장되어 있는 수식을 확인해 보세요. ..
Popular
· Database
이번 글에서는 MySQL에서 공간 데이터를 다루는 법을 알아보고 실습을 통해 성능을 비교해 본 것을 기록합니다. 특히 가장 많이 사용되는 특정 좌표로부터 특정 거리 내의 좌표를 찾는 연산을 위주로 실습하고 인덱스와 공간 연산의 성능을 테스트합니다. 들어가기 앞서 제가 이 글에서 사용한 MySQL 버전은 v8.3.0입니다. MySQL의 공간 데이터 MySQL의 `MyISAM`, `InnoDB`, `NDB`, `ARCHIVE` 스토리지 엔진은 공간 데이터 타입과 관련 함수를 지원합니다. 이 중 `MyISAM`과 `InnoDB`는 공간 데이터 타입 컬럼에 대해 공간 인덱스와 비공간 인덱스를 지원하고 `NDB`와 `ARCHIVE`는 비공간 인덱스만 지원합니다. `InnoDB`는 데카르트 SRS와 geograph..
현대자동차 소프티어 부트캠프 3기 교육이 시작된 지 2주 정도의 시간이 지났습니다. 소프티어 OT를 기다리던 날이 엊그제 같은데 벌써 2주라니... 2주 동안 해가 바뀌며 저의 생일이 있었고 소프티어 교육에서는 3번의 조편성과 한 번의 프로젝트, 디자인과 기획 그리고 GA에 대한 교육이 있었습니다. 앞으로 남은 교육 또한 빠르게 지나갈 거라는 생각이 들어 새삼 밀도 높은 시간을 보내야 할 것 같다는 생각이 들었습니다. 남은 시간 후회 없이 보내고자 다음 교육 시작 전에 지금까지의 기간을 회고하고자 합니다. 회고 전에 앞서 제가 소프티어 부트캠프를 신청할 당시 제가 정한 목표는 "좋은 사람들을 많이 만나 많은걸 배우자"입니다. 물론 취업 연계를 통한 현대자동차 입사가 가장 중요하고 이루고 싶은 목표이고 이..
· Node.js
로그인 시 빼놓으면 섭섭한 passport.js의 github을 살펴보며 passport의 흐름에 대해 정리해보자. Passport.js `passport.js`는 인증을 도와주는 미들 웨어입니다. passport는 Oauth와 세션 쿠키 관리를 쉽게 도와줍니다. passportjs를 사용하며 공식문서가 조금 빈약하다고 느껴졌고 passport의 깃헙의 코드를 읽어봤습니다. 주석으로 설명이 너무 잘되어있어 깃헙을 읽게 된 과정과 내용을 정리해보려 합니다. 글이 다소 복잡할 수 있어 캡쳐와 그림만 봐도 내용을 이해하는데 큰 무리가 없도록 노력했습니다. 이 글에서는 제가 작성한 예시 코드로 설명합니다. 예시코드는 깃헙 repository에 공유해두었습니다. 이 글은 크게 두가지 내용을 담고 있습니다. pas..
· etc.
프레임워크를 사용하거나 공부하다 보면 의존성 주입, 제어의 역전과 같은 말을 많이 접하게 됩니다. 대충 이런 뜻이겠거니 하며 짐작은 가지만 정확히 무엇을 말하는지 모르겠습니다. 이번 글에서는 의존성 주입이 무엇인지 왜 이런 개념들이 등장했고 왜 사용하는지 알아보겠습니다. 의존성 의존성 주입을 알아보기 전에 먼저 의존성에 대해 알아봅시다. 프로그래밍에서 `의존성(Dependency)`는 변경 혹은 에러로부터 영향을 받는다는 의미로 이해할 수 있습니다. 즉, "A가 B에 대한 의존성을 갖는다."라는 말은 A가 B의 변경 혹은 에러로부터 영향을 받는다는 의미로 받아들일 수 있습니다. 예시 1 - 의존성 아주 간단한 예시를 들어보겠습니다. 사람이 음료수를 먹는 예시입니다. 이 글은 아래 예시 코드를 고쳐가며 설..
· Programmers
분류 : bfs, 3차원 bfs / 문제 문제 링크 문제 설명 건설회사의 설계사인 죠르디는 고객사로부터 자동차 경주로 건설에 필요한 견적을 의뢰받았습니다. 제공된 경주로 설계 도면에 따르면 경주로 부지는 N x N 크기의 정사각형 격자 형태이며 각 격자는 1 x 1 크기입니다. 설계 도면에는 각 격자의 칸은 0 또는 1 로 채워져 있으며, 0은 칸이 비어 있음을 1은 해당 칸이 벽으로 채워져 있음을 나타냅니다. 경주로의 출발점은 (0, 0) 칸(좌측 상단)이며, 도착점은 (N-1, N-1) 칸(우측 하단)입니다. 죠르디는 출발점인 (0, 0) 칸에서 출발한 자동차가 도착점인 (N-1, N-1) 칸까지 무사히 도달할 수 있게 중간에 끊기지 않도록 경주로를 건설해야 합니다. 경주로는 상, 하, 좌, 우로 인..
· BOJ
분류: 수학, 3차원 좌표계 / 문제 문제 링크 문제 설명 There are different methods of transporting people from place to place: cars, bikes, boats, trains, planes, etc. For very long distances, people generally fly in a plane. But this has the disadvantage that the plane must fly around the curved surface of the earth. A distance travelled would be shorter if the traveller followed a straight line from one point to th..
· BOJ
분류: 트리 union, 재귀, bfs, dfs / 문제 문제 링크 문제 설명 루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 노드의 개수 N (2 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N-1개의 줄에 트리 상에서 연결된 두 정점이 주어진다. 출력 첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다. 풀이 - 트리 union (Python) import sys sys.setrecursionlimit(100_000) read = sys.stdin.readline N = int(read()) parent = [0] * (N + 1) parent[1] = 1 def uni..
· BOJ
분류: 스택 / 문제 문제 링크 문제 설명 오아시스의 재결합 공연에 N명이 한 줄로 서서 기다리고 있다. 이 역사적인 순간을 맞이하기 위해 줄에 서서 기다리고 있던 백준이는 갑자기 자기가 볼 수 있는 사람의 수가 궁금해졌다. 두 사람 A와 B가 서로 볼 수 있으려면, 두 사람 사이에 A 또는 B보다 키가 큰 사람이 없어야 한다. 줄에 서있는 사람의 키가 주어졌을 때, 서로 볼 수 있는 쌍의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 줄에서 기다리고 있는 사람의 수 N이 주어진다. (1 ≤ N ≤ 500,000) 둘째 줄부터 N개의 줄에는 각 사람의 키가 나노미터 단위로 주어진다. 모든 사람의 키는 231 나노미터 보다 작다. 사람들이 서 있는 순서대로 입력이 주어진다. 출력 서로 볼 수 있는 쌍..
· BOJ
분류: 요세푸스 문제, 큐 / 문제 문제 링크 문제 설명 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 한 장 남을 때까지 반복하게 된다. 우선, 제일 위에 있는 카드를 바닥에 버린다. 그 다음, 제일 위에 있는 카드를 제일 아래에 있는 카드 밑으로 옮긴다. 예를 들어 N=4인 경우를 생각해 보자. 카드는 제일 위에서부터 1234 의 순서로 놓여있다. 1을 버리면 234가 남는다. 여기서 2를 제일 아래로 옮기면 342가 된다. 3을 버리면 42가 되고, 4를 밑으로 옮기면 24가 된다. 마지막으로 2를 버리고 나면, 남는 카드는 4가 된다. N이 주어졌..
Computer Science
· etc.
구글이 리눅스 커널 패치를 통해 TCP 통신성능을 40%까지 향상할 수 있었다는 것을 알게 됐습니다. 어떻게 했길래 40%라는 수치가 나오는지 궁금해서 알아보았고 아주 단순하고 그냥 지나칠 수 있는 기본 지식을 실제로 적용하는 것이 성능에 크게 영향을 미칠 수 있다는 사실이 놀라워 글로 작성해 봅니다. 원본 아티클: Linux 6.8 Network Optimizations Can Boost TCP Performance For Many Concurrent Connections By ~ 40% 유튜브 영상: Google Patches Linux kernel with 40% TCP performance - Hussein Nasser 구글은 어떻게 성능을 향상했는가? 구글은 리눅스 커널의 TCP 성능을 향..
· Database
이번 글에서는 MySQL에서 공간 데이터를 다루는 법을 알아보고 실습을 통해 성능을 비교해 본 것을 기록합니다. 특히 가장 많이 사용되는 특정 좌표로부터 특정 거리 내의 좌표를 찾는 연산을 위주로 실습하고 인덱스와 공간 연산의 성능을 테스트합니다. 들어가기 앞서 제가 이 글에서 사용한 MySQL 버전은 v8.3.0입니다. MySQL의 공간 데이터 MySQL의 `MyISAM`, `InnoDB`, `NDB`, `ARCHIVE` 스토리지 엔진은 공간 데이터 타입과 관련 함수를 지원합니다. 이 중 `MyISAM`과 `InnoDB`는 공간 데이터 타입 컬럼에 대해 공간 인덱스와 비공간 인덱스를 지원하고 `NDB`와 `ARCHIVE`는 비공간 인덱스만 지원합니다. `InnoDB`는 데카르트 SRS와 geograph..
· Database
MySQL 실습을 위해 MySQL에서 제공하는 Example database중 employee 데이터를 다운받고 데이터베이스를 생성해봅시다. Example Database MySQL에서는 실습에 유용한 다양한 관계를 갖는 데이터베스와 데이터를 제공합니다. 공식문서에서 데이터베이스 생성 방법을 확인 할 수 있습니다. employee 데이터를 다운 받고 생성해봅시다. employee 데이터베이스 구조는 아래와 같습니다. 데이터 다운로드 employee의 경우 깃헙에서 다운받을 수 있습니다. 쉽게 zip 파일로 다운받을 수있습니다. 압축을 푼 폴더에서 터미널을 엽니다. 데이터베이스 생성, 데이터 삽입 이제 employees.sql 스크립트를 실행합니다. `employees`라는 이름의 데이터베이스가 이미 존재..
· Network
[Data Communications and Networking, 5th, Behrouz A. Forouzan] Table of Contents Networks `network`: 통신 링크들에 의해 연결된 장치(노드)들의 집합. `장치(Device)`: host, end sytem, connectiong device such as router - Network Criteria 네트워크 기준(평가 기준으로 이해했다.) Performance: 성능 Reliability: 신뢰성(재난 등) Security: 보안 # Performance: 성능 전송 시간(transit time), 응답 시간(response time) 등 많은 방법으로 측정. `전송시간(Transit time)`: 메시지 하나의 전송에 소요..
· Network
[Data Communications and Networking, 5th, Behrouz A. Forouzan] Table of Contents Data Communications `telecommunication`: 원거리 통신("tele"는 그리스 어로 "far"이라는 뜻이다.) telephone, telegraphy, etc. `data`: 자료. 약속된 형태로 표현된 정보(information presented in whaterver form is agreed upon) 여기서 약속된 형태의 예로 이진수(binary informations units)가 있다. + 앞으로 data는 데이터 혹은 자료, information은 정보로 번역하겠습니다. `data communication`: 통신 매체(..
· Algorithm
요세푸스 문제 유대-로마 전쟁에서 플라비우스 요세푸스는 병사 40명과 함께 로마군에게 포위됐습니다. 포위된 요세푸스는 병사들과 함께 로마군에게 죽느니 우리들의 손으로 목숨을 끊자는 결심을 합니다. 이들은 원형으로 선 뒤 시계방향으로 자신의 옆사람을 죽여주기로 했습니다. 요세푸스는 마지막에 홀로 살아남아 스스로 목숨을 끊지 않고 로마군에 항복했습니다. 만약 요세푸스가 처음부터 살고 싶었다면 어디에 서야 마지막에 살아남을 수 있을까요? 이 질문이 요세푸스 문제입니다. 원형 리스트를 순회하며 특정 조건으로 요소를 하나씩 제거했을 때 제거되는 순서를 `요세푸스 순열(Josephus permutation)`, 마지막에 남는 요소를 알아내는 문제를 `요세푸스 문제(Josephus problem)`라고 합니다. 해설..
· Network
Data Communications and Networking, 5th, Behrouz A. Forouzan을 읽고 정리한 내용입니다. Chapter 1. Introduction 💡 학습 목표 `데이터 커뮤니케이션의 요소`와 `데이터 교환 유형`을 살펴본다. 네트워크에서 `데이터의 표현 방법`과 `데이터의 흐름`을 살펴본다. `네트워크`를 살펴보고 네트워크의 `구조`와 `평가 기준`들을 살펴본다. 4가지 `네트워크 토폴로지(network topologies)`를 알아본다. `네트워크의 타입`(LANs, WANs and internetworks)을 알아본다. `the Internet`을 살펴본다. `스위칭(switching)`을 통해 어떻게 작은 네트워크가 모여 큰 네트워크가 되는지 살펴본다. `the I..
· etc.
많은 프로그래밍 언어가 나머지 연산자를 제공합니다. 하지만 언어마다 결과가 다를 때가 있습니다. C언어, Java, Python, Javascript 네 가지 언어에 대해 나머지 연산자를 비교해 봅시다. 모듈러 위키 백과를 보면 `모듈러 산술(Modular Arithmetic)`를 다음과 같이 정의합니다. 💡 모듈러 산술 혹은 합동 산술은 정수의 합과 곱을 어떤 주어진 수의 나머지에 대하여 정의하는 방법이다. 임의의 정수 $a, b$가 있을 때, 정수 $n$에 대해 $a=b+kn$을 만족시키는 정수 $k$가 존재한다면 $a$와 $b$는 같은 동치류에 속하고 $n$에 대해 합동이라고 합니다. 기호로는 다음과 같이 씁니다. $a\equiv b\space(\text{mod}\space n)$ $n=3$일 때 ..
제가 블로그에 쓴 자료구조와 알고리즘 글들을 모아 정리했습니다. 자료 구조 연결 리스트(linked list) - 단일 연결 리스트, Java 구현 스택(stack) - 단일 연결 리스트와 배열을 이용한 스택, Java 구현 큐(Queue) - 단일 연결 리스트를 이용한 Deque, Java 구현 알고리즘 시간 복잡도와 점근적 표기법 재귀 알고리즘의 시간 복잡도 계산 선택 정렬(Selection Sort) - C++, Java, Python 구현 삽입 정렬(Insertion Sort) - C++, Java, Python 구현 버블 정렬(Bubble Sort) - C++, Java, Python 구현 병합 정렬(Merge Sort) - C++, Java, Python 구현 퀵 정렬(Quick Sort) -..
스택과 비교해 보며 큐 자료 구조에 대해 알아봅시다. 이번 글에서는 java로 `양방향 큐(deque)`를 `이중 연결 리스트(doubly linked list)`로 구현합니다. 자료구조, 알고리즘 시리즈 모아보기 큐 `큐(queue)`는 이름 그대로 줄 서는 것과 같습니다.(줄 서 있는 것을 미국에서는 line이라고 하지만 영국에서는 queue라고 합니다.) 줄을 설 때를 생각해 보면 먼저 온 사람이 먼저 원하는 것을 얻습니다. 늦게 온 사람은 늦게 얻죠. 이런 구조를 `FIFO(First In First Out)`이라 합니다. - 연산 큐 또한 스택과 마찬가지로 `추상 자료 유형(Abstract Data Type)`으로 연산(행위)으로 정의됩니다. enqueue: 새로운 요소를 자료 구조에 추가 de..
스택 자료구조에 대해 알아보고 java로 구현해 봅시다. 자료구조, 알고리즘 시리즈 모아보기 스택 `스택(stack)`은 이름 그대로 자료를 쌓아 놨다고 생각하는 `추상 자료 유형(Abstract Data Type)`입니다. 흔히 프링글스, 팬케이크로 예시를 듭니다. 가장 마지막에 프링글스 통에 넣은 프링글스 칩, 가장 마지막에 쌓은 팬케이크는 바로 먹을 수 있지만 가장 예전에 넣은(처음 넣은) 것은 꺼내기 힘듭니다. 스택은 위 예시와 같이 마지막에 넣은 것이 처음으로 나오는 `LIFO(Last In First Out)`구조로 최신 순으로 자료에 접근이 가능합니다. - 연산 스택은 추상 자료 유형으로 다음과 같은 연산(행위)으로 정의됩니다. 스택은 크게 push와 pop이라는 두 개의 연산으로 정의됩니다..
연결 리스트의 가장 기본이 되는 단일 연결 리스트로 연결 리스트를 이해해 봅시다. 자료구조, 알고리즘 시리즈 모아보기 연결 리스트 `연결 리스트(linked list)`는 데이터와 다음 데이터의 위치를 함께 저장하여 데이터들을 체인처럼 연결하는 자료 구조입니다. 여기서 저장되는 자료의 단위(데이터와 다음 자료의 위치를 묶은 구조체)를 `노드(node)`라고 부릅니다. 다시 말하면 연결 리스트는 데이터와 다음 노드의 참조값을 갖는 노드들로 연결된 자료 구조입니다. 연결 리스트는 연결되는 방법에 따라 `단일 연결 리스트(singly linked list)`, `이중 연결 리스트(doubly linked list)`, `다중 연결 리스트(multi-linked list)`, `원형 연결 리스트(circular..
New Posts
· BOJ
분류: DP, DFS / 문제 문제 링크 문제 설명 유현이가 새 집으로 이사했다. 새 집의 크기는 N×N의 격자판으로 나타낼 수 있고, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 (r, c)로 나타낼 수 있다. 여기서 r은 행의 번호, c는 열의 번호이고, 행과 열의 번호는 1부터 시작한다. 각각의 칸은 빈 칸이거나 벽이다. 오늘은 집 수리를 위해서 파이프 하나를 옮기려고 한다. 파이프는 아래와 같은 형태이고, 2개의 연속된 칸을 차지하는 크기이다. 파이프는 회전시킬 수 있으며, 아래와 같이 3가지 방향이 가능하다. 파이프는 매우 무겁기 때문에, 유현이는 파이프를 밀어서 이동시키려고 한다. 벽에는 새로운 벽지를 발랐기 때문에, 파이프가 벽을 긁으면 안 된다. 즉, 파이프는 항상 빈 칸만 차..
소프티어 부트캠프를 수료하고 한 달이라는 시간이 지났습니다. 조금이라도 기억이 생생할 때 부트캠프 회고를 마저 해보려 합니다. 소프티어 부트캠프 BE 직무는 크게 3가지 프로젝트로 진행됐습니다. 이 글에서는 BE WAS 프로젝트를 다룹니다. 워밍업 프로젝트(2주, 기획 + 디자인 + FE/Android + BE) BE WAS 프로젝트(2주, BE) 최종 프로젝트(4주, BE + FE/Android) WAS 프로젝트 BE WAS 프로젝트는 plain Java로 WAS를 구현하는 프로젝트입니다. 워밍업 프로젝트 회고에서 말씀 드렸듯 저는 Java로 알고리즘 문제만 풀어봤지 Spring 프레임워크를 사용해 본적도, 어떤 프로그램을 제작해 본 경험도 없습니다. 따라서 BE WAS를 진행하며 Spring 프레임워..
· BOJ
분류: 시뮬레이션, 완전 탐색 / 문제 문제 링크 문제 설명 혹시 마지막으로 엠티를 간 것이 언제인가? 엠티를 안간지 꽤 오래됐다면 요즘 유행하는 인싸들의 가위바위보를 모를 것이다. 요즘 인싸들은 엠티에서 평범한 가위바위보를 시시하다는 이유로 더 이상 취급하지 않는다. 대신 가위불바위총번개악마용물공기보스펀지늑대나무사람뱀을 한다. 이 게임의 명칭이 다소 긴 관계로 문제 내에서는 전체 명칭을 적는 대신 이 게임의 또 다른 이름인 인싸 가위바위보로 부르겠다. 인싸 가위바위보는 평범한 가위바위보와 같이 각 손동작간의 상성이 정해져있다. 인싸 가위바위보는 평범한 가위바위보보다 흥미진진하고 재밌지만 3명 이상이 경기를 할 때 누가 이기고 누가 졌는지를 빠르게 알기 힘들다는 단점이 있다. 그렇기에 3명 이상의 사람들..
· BOJ
분류: 백트래킹 / 문제 문제 링크 문제 설명 서양 장기인 체스에는 대각선 방향으로 움직일 수 있는 비숍(bishop)이 있다. 과 같은 정사각형 체스판 위에 B라고 표시된 곳에 비숍이 있을 때 비숍은 대각선 방향으로 움직여 O로 표시된 칸에 있는 다른 말을 잡을 수 있다. 그런데 체스판 위에는 비숍이 놓일 수 없는 곳이 있다. 에서 체스판에 색칠된 부분은 비숍이 놓일 수 없다고 하자. 이와 같은 체스판에 서로가 서로를 잡을 수 없도록 하면서 비숍을 놓는다면 과 같이 최대 7개의 비숍을 놓을 수 있다. 색칠된 부분에는 비숍이 놓일 수 없지만 지나갈 수는 있다. 정사각형 체스판의 한 변에 놓인 칸의 개수를 체스판의 ..
· Programmers
분류: MST, 크루스칼 알고리즘 문제 문제 링크 문제 설명 n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요. 다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다. 제한사항 섬의 개수 n은 1 이상 100 이하입니다. costs의 길이는 ((n-1) * n) / 2이하입니다. 임의의 i에 대해, costs[i][0] 와 costs[i] [1]에는 다리가 연결되는 두 섬의 번호가 들어있고, costs[i] [2]에는 이 ..
· etc.
구글이 리눅스 커널 패치를 통해 TCP 통신성능을 40%까지 향상할 수 있었다는 것을 알게 됐습니다. 어떻게 했길래 40%라는 수치가 나오는지 궁금해서 알아보았고 아주 단순하고 그냥 지나칠 수 있는 기본 지식을 실제로 적용하는 것이 성능에 크게 영향을 미칠 수 있다는 사실이 놀라워 글로 작성해 봅니다. 원본 아티클: Linux 6.8 Network Optimizations Can Boost TCP Performance For Many Concurrent Connections By ~ 40% 유튜브 영상: Google Patches Linux kernel with 40% TCP performance - Hussein Nasser 구글은 어떻게 성능을 향상했는가? 구글은 리눅스 커널의 TCP 성능을 향..
· BOJ
분류: DFS, 백트래킹 / 문제 문제 링크 문제 설명 한수는 캠프를 마치고 집에 돌아가려 한다. 한수는 현재 왼쪽 아래점에 있고 집은 오른쪽 위에 있다. 그리고 한수는 집에 돌아가는 방법이 다양하다. 단, 한수는 똑똑하여 한번 지나친 곳을 다시 방문하지는 않는다. cdef ...f ..ef ..gh cdeh cdej ...f bT.. .T.e .Td. .Tfe bTfg bTfi .Tde a... abcd abc. abcd a... a.gh abc. 거리 : 6 6 6 8 8 10 6 위 예제는 한수가 집에 돌아갈 수 있는 모든 경우를 나타낸 것이다. T로 표시된 부분은 가지 못하는 부분이다. 문제는 R x C 맵에 못가는 부분이 주어지고 거리 K가 주어지면 한수가 집까지도 도착하는 경우 중 거리가 K인..
타요의 예약 시스템 저희 프로젝트 타요에서 핵심 기능을 하나만 뽑으라면 뭐니 뭐니 해도 예약일 것입니다. 저희의 예약 시스템을 간략하게 설명드리면 아래와 같습니다. 차를 빌려주는 사람(이하 호스트)은 본인 차량의 예약 가능 기간을 설정할 수 있다. 차를 빌리는 사람(이하 게스트)은 해당 차량의 예약 가능 기간안에서 예약할 수 있다. 모든 예약은 해당 차량의 예약 가능 기간 중 한 구간에 완전히 포함되어야 하며 서로 겹치는 날짜가 있어서는 안 된다. 이렇게 적고 보니 알고리즘 문제 같네요. 에어비앤비의 예약 시스템과 굉장히 비슷합니다! 저희는 위 문제에 맞는 DB 구조에 대해서 비교적 오랜 시간 고민했고 결론을 내린 후에도 몇 번의 변경이 있었습니다. 개인적으로 정말 재밌었던 경험이었고 `진짜_최종_결론`..
· Database
이번 글에서는 MySQL에서 공간 데이터를 다루는 법을 알아보고 실습을 통해 성능을 비교해 본 것을 기록합니다. 특히 가장 많이 사용되는 특정 좌표로부터 특정 거리 내의 좌표를 찾는 연산을 위주로 실습하고 인덱스와 공간 연산의 성능을 테스트합니다. 들어가기 앞서 제가 이 글에서 사용한 MySQL 버전은 v8.3.0입니다. MySQL의 공간 데이터 MySQL의 `MyISAM`, `InnoDB`, `NDB`, `ARCHIVE` 스토리지 엔진은 공간 데이터 타입과 관련 함수를 지원합니다. 이 중 `MyISAM`과 `InnoDB`는 공간 데이터 타입 컬럼에 대해 공간 인덱스와 비공간 인덱스를 지원하고 `NDB`와 `ARCHIVE`는 비공간 인덱스만 지원합니다. `InnoDB`는 데카르트 SRS와 geograph..
· Java
Thread Java에서는 JDK 1.0부터 `Thread` 클래스를 제공해 멀티태스킹을 지원했습니다.(Thread) `Thread` 클래스를 통해 스레드를 생성할 수 있고 이 클래스를 상속받아 run() 메서드를 오버라이드하거나 `Runnable` 인터페이스를 구현해 `Thread` 클래스 생성자의 인자로 넘겨줌으로써 원하는 작업을 수행하는 스레드를 생성할 수 있습니다. 스레드의 상태는 다음과 같습니다. (Thread.State) New: 새로 생성된 스레드, 아직 시작되지 않음 Runnable: 실행 가능 혹은 실행 중인 상태 Blocked: 동기화에 의해 차단됨 Waiting: 다른 스레드가 특정 액션을 수행하길 기다림 Timed Waiting: 지정된 시간 동안 기다림 Terminated: 실행 ..
현대자동차 소프티어 부트캠프 3기 교육이 시작된 지 2주 정도의 시간이 지났습니다. 소프티어 OT를 기다리던 날이 엊그제 같은데 벌써 2주라니... 2주 동안 해가 바뀌며 저의 생일이 있었고 소프티어 교육에서는 3번의 조편성과 한 번의 프로젝트, 디자인과 기획 그리고 GA에 대한 교육이 있었습니다. 앞으로 남은 교육 또한 빠르게 지나갈 거라는 생각이 들어 새삼 밀도 높은 시간을 보내야 할 것 같다는 생각이 들었습니다. 남은 시간 후회 없이 보내고자 다음 교육 시작 전에 지금까지의 기간을 회고하고자 합니다. 회고 전에 앞서 제가 소프티어 부트캠프를 신청할 당시 제가 정한 목표는 "좋은 사람들을 많이 만나 많은걸 배우자"입니다. 물론 취업 연계를 통한 현대자동차 입사가 가장 중요하고 이루고 싶은 목표이고 이..
· Java
이번 글에서는 macOS에서 JDK 버전 관리 방법을 다룹니다. nodejs에서는 `n` 혹은 `nvm`과 같은 버전을 관리 툴을 사용하면 손쉽게 새로운 버전을 확인, 설치할 수 있고 설치된 버전을 변경, 삭제할 수 있습니다. java에서는 설정할 것이 노드에 비해 더 많기 때문에 미래의 저와 다른 분들에게 도움이 되고자 블로그에 정리해 봅니다. 이 글은 설정 과정과 이유를 담고 있습니다. 빠르게 설정만 필요하신 분들은 글 아래의 `정리` 부분을 바로 읽으시면 시간을 아끼실 수 있습니다. Homebrew 설치 `Homebrew`는 macOS의 오픈소스 패키지 관리 시스템입니다. CLI기반 툴이라 처음 사용하시면 어색할 수 있지만 JDK 버전 관리 글을 읽고 있는 분이라면 익숙하실 거라 생각합니다. hom..
thecloer
오프로드 탐험기