전체 글 162

[알고리즘] ICPC 2023 + 코드포스 퍼플 후기

ICPC 2023이 열렸다! 작년보다 좀 늦게 열린 것 같다. 이제 졸업했기때문에 정식으로 ICPC에 나갈 수 없어서 예선은 개인적으로 치고 본선은 Mirror Contest를 참여했다. 작년에 함께 나갔던 팀에서 내가 빠지고 다른 팀원을 구한 것 같다. 작년이랑 마찬가지로 Ilgam Rangers로 나왔다. ㅋㅋ ICPC 2023 예선 예선은 Mirror Contest도 열리지 않기 때문에 문제지만 보고 대충 코드 짜는 식으로 진행했다. 정답 여부를 확인할 수 없으니 믿음으로 가야했다. 예선에선 C, D, G, I, K를 건드렸던 것 같다. 실제로 백준에 올라온 문제로 제출해보니 D, I만 맞았다. ㅋㅋ C는 가장 쉬운 문제였는데 아마 출력 형식이 달라서 틀린 것 같다. (소숫점 출력인데 스페셜저지가 ..

[개발] RDB에서 Incremental PK와 UUID PK

나는 요즘 관계형 데이터베이스로 개발을 진행하고 있다. 근데 최근 들은 내용이 꽤 흥미로워서 기록으로 남겨보려고 한다. 관계형 데이터베이스에서의 PK 관계형 데이터베이스에는 여러가지 키라는 개념이 존재한다. 기본키, 수퍼키, 후보키 등이 존재하는데 여기서는 기본키(Primary Key)에 집중하려고 한다. 데이터베이스 교과서를 보면 PK를 다음과 같이 정의한다. 릴레이션 안에서 튜플을 구별하기 위한 수단으로 주 키(primary key)라는 용어를 사용한다. 릴레이션은 테이블을 튜플은 row를 의미하므로 PK는 곧 테이블 안에서 unique한 컬럼을 의미하게 된다. 그 중에서 가장 흔하게 사용되는 PK는 아마 auto_increment옵션이 붙어있는 integer일 것이다. 이는 데이터베이스 내부에서 자..

[알고리즘] KUPC 2023 출제 후기

작년 KUPC에 이어 올해도 KUPC가 열렸다. 대회는 11월 4일에 있었지만 포스팅을 미루고 미루다 지금 쓰게 되었다. ㅋㅋ 올해는 졸업도 했고 회사도 다니고 해서 운영은 크게 관여를 못했고 출제와 검수 위주로 했다. 작년 운영진 중 일부가 참가한다고 해서 올해 만들어진 동아리에서 원하는 사람이 추가로 출제자가 되었다. 사진이 없었으면 심심한 글이 될 뻔했는데 제공해주신 kth990303에게 감사를 표합니다. 문제 구상 과정 다른 출제자는 모르겠지만 나는 다음을 베이스로 잡고 문제를 출제하려고 했다. 쉽덕 알고리즘, 사전지식을 사용하지 않아야한다. 직관적이고 지문이 난해하지 않아야 한다. (내가 글을 못쓰기 때문) 난이도가 어려우면 안되지만 그렇다고 올솔브도 나오면 안된다. 위 조건들을 생각하다보니 나..

[현대대수학] Resultant 활용 - 음함수 찾기

지난 시간 가볍게 알아본 Resultant를 활용해보자. 가환대수학에 포함되는 Elimination Theory에 있는 매개변수 함수를 음함수로 나타내는 법을 알아볼 것이다. 아직 Resultant의 성질은 알아보지 않았지만 그래도 충분하다. 음함수와 매개변수 함수 수학적인 함수를 표현하는 다양한 방법이 있다. $y = f(x)$같이 나타내는 양함수(Explicit function), $F(x,y) = 0$같이 나타내는 음함수(Implicit function), $x = f(t), y = g(t)$로 나타내는 매개변수 함수(Parameterized function)가 그 예시이다. 각 표현에 있어서 장단점이 있고 여기에서는 음함수와 매개변수 함수에 주목한다. 우리의 질문은 "매개변수로 표현된 함수를 음함..

[현대대수학] Sylvester 행렬과 Resultant

다항식의 공통 근 두 다항식 $f, g$가 주어질 때 공통 근이 존재하는지 판단하려면 어떻게 해야 할까? 가장 쉬운 방법은 각각의 근을 모두 구하고 겹치는게 있는지 확인하는 것이다. 하지만 이는 2차 다항식까지는 근의 공식으로 편리하게 확인할 수 있지만 3차 이상으로 올라가게 되면 자명한 근 아니면 찾기 힘들어진다. 한 번 알 방법이 있는지 알아보자. 다항식이 공통 근을 가지려면.. $r$차 다항식 $f(x) = a_r x^r + a_{r-1} x^{r-1} + ... + a_1 x + a_0$과 $s$차 다항식 $g(x) = b_s x^s + b_{s-1} x^{s-1} + ... + b_1x^1 + b_0$이 있다. 다항식이 어떤 근 $\alpha$를 가진다는 것은 $x-\alpha$를 인수로 가진다..

[개발] 주니어 개발자의 우당탕탕 MSA 전환기 - DB 편

현재 내가 진행중인 프로젝트는 장고 하나의 서버에서 모놀리식으로 작동하고 있었다. 최근에 쿠버네티스를 도입하게 되어 이 기회에 MSA로 넘어가려는 시도를 하였다. 기획자에게 더 많은 사용자를 수용하고 성능도 더 나아지며 관리포인트가 줄어든다는 점을 들어 설득하여 기간을 할당받는데 OK를 받았다. 그렇게 MSA로 전환하기 시작한 여정이 시작된다. 장고에서 FastAPI로.. MSA로 넘어가며 장고를 포기하고 FastAPI를 사용하게 되었는데 그 이유는 2가지가 있다. 서드파티 등 장고의 풍부한 기능을 사용하지 않는다. MSA 서비스마다 장고로 띄우기엔 너무 무겁다. 처음부터 "뭐야 장고 정말 안좋네? FastAPI ㄱㄱ"한건 아니고 나름대로 문제를 해결하려고 시도는 했었다. 인스타그램같은 경우도 장고를 사..

[알고리즘] Git과 LCS

Git은 개발할 때 없어서는 안되는 존재이다. 코드 관리, 버전 관리, 자동 병합, 브랜치 관리 등 정말 많은 기능을 수행하고 있다. 그 중 코드 관리를 살펴보고자 한다. 깃은 코드의 변화를 자동으로 추적하며 위 사진과 같이 변경된 사항을 자동으로 추적한다. 어떻게 변화한 부분만 정확히 골라서 표시하는 것일까? LCSLCS(Longest Common Subsequence/Substring)은 두 문자열/수열이 존재할 때 공통으로 존재하는 가장 긴 문자열/수열을 추출하는 알고리즘이다. LCS에서 S를 Substring으로 쓰면 공통된 문자열, Subsequence로 쓰면 공통된 수열이다. 둘의 차이는 공통된 요소가 연속인지 여부이다. 연속이라면 Substring, 불연속이라면 Subsequence이다. I..

[개발] Redis를 사용한 데이터 캐싱으로 조회 API성능 향상시키기

캐싱 캐싱은 데이터를 적당한 장소에 저장하여 다음에 같은 데이터 조회 요청이 들어왔을 때 빠르게 데이터를 획득할 수 있도록 한다. API를 호출하면 보통 데이터베이스를 조회하고 어떠한 연산을 통해 결과값을 반환한다. 하지만 트래픽이 늘어나거나 해당 연산이 오래걸릴 경우 서비스가 느려질 수 있다. 그럴 경우 캐싱을 통해 미리 저장해두고 빠르게 반환하는 방법을 생각할 수 있다. 레디스 캐싱을 사용할때 레디스가 많이 언급된다. 레디스는 key-value를 저장하는 In-memory DB이며 다음과 같은 특징이 있다. 1. 싱글스레드만 접근 가능하다. 2. string외에 다양한 데이터 타입을 지원한다. 3. 인메모리 데이터베이스이면서 디스크에 저장까지 한다. 4. 속도가 굉장히 빠르다. redis는 보통 같은..

[개발] VPC 개념잡기

VPC는 클라우드상에서 제공하는 가상의 네트워크이다. AWS에서 서비스를 사용할 때는 반드시 VPC를 하나 사용해야 하며 VPC를 사용해서 보안성을 증가시킬 수 있다. VPC를 사용하여 설정한 IP대역을 할당받아 사용할 수 있다. 기본적으로 default VPC가 주어지며 아마 172.31.0.0/16으로 설정돼있을 것이다. VPC에 서브넷을 구성할 수 있다. VPC에서 IP영역을 나눠 작은 네트워크로 사용할 수 있다. 보통 서브넷은 기능이나 역할로 구분을 하는데 가장 많이 사용되는 서브넷 패턴은 세 가지 종류가 있다. 1. public 서브넷 2. private 서브넷 3. Intranet Public 서브넷 public 서브넷은 말 그대로 public에 노출되어 있다는 뜻이다. public 서브넷의 ..

[쿠버네티스] 8. EKS 무작정 사용하기 (1)

EKS는 AWS에서 제공하는 쿠버네티스 서비스이다. 쿠버네티스 특성상 마스터노드가 터지면 안되는데 AWS에서 이를 최대한 안 터지도록 고가용성을 보장한다. 또한 관리해야할 여러 요소들을 AWS에서 관리해준다. EKS를 사용하면 클러스터를 구축해서 아래 요소들을 사용할 수 있다. 이용 요금 클러스터를 하나 생성하면 시간당 0.1달러를 지불한다. 프리티어는 따로 없고 쿠버네티스에서 생성한 워커노드에 따라 가격이 달라진다. EC2를 생성한다면 그 스펙에 맞는 EC2비용이 추가로 지불되고 Fargate를 사용한다면 사용한 만큼의 Fargate요금이 지불될 것이다. 권한 설정 ECR에서 한 것처럼 EKS도 액세스키를 위해 권한이 있는 사용자가 필요하다. EKS의 모든 기능을 사용할 수 있도록 권한을 부여하자. 그..