프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 약간의 테크닉이 필요한 다익스트라 응용 문제이다. 출발점 노드들이 주어지고, 산봉우리 노드들이 주어진다. 출발지 노드를 start라 하고, 산봉우리 노드를 end라고 하겠다. 우리가 구하고 싶은 값은 start -> end -> start로 탐색을 진행할때 지나온 간선의 가중치 최솟값이다. 여기서 약간만 생각하면 start -> end만 구해도 된다는 것을 눈치챌 수 있다. 굳이 end -> start를 탐색할 필요가 없기 때문이다. 그냥 start -> end에 도달하는 경로를 찾았다면 그 길을 따라서 그대..
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 제한이 매우 널널해서 DFS로도 풀리는데 그냥 BFS가 더 간단해서 BFS로 풀었다. 구하고자 하는 것은 2차원 배열이 주어질때, 'P'의 거리가 2이하인 경우가 있는지 없는지이다. 따라서 'P'를 기준으로 탐색을 진행해서 거리 2 이내에 다른 'P'가 있는지 확인하면 된다. 주의해야 할것은 BFS를 돌릴때마다 방문 배열을 전부 밀어버려야 한다는 것이다. O(N^5)에 풀린다. import java.util.*; class Solution { private int[][] visited = new int[5][..
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr numbers 배열이 주어진다. 우리가 구하고 싶은 값은 numbers[i]를 기준으로 [i+1 ... numbers.length] 사이에 있는 숫자중 가장 가까우면서 numbers[i]보다 큰 숫자이다. 제한이 100만이기 때문에 O(N), O(NlogN) 이내에 풀어야 할 것 같은데 logN은 이분탐색말고 떠오르지 않으니 그냥 O(N)으로 접근해보자. 뒤에 있는 숫자 중 하나를 채우는 것이기 때문에 딱봐도 뒤에서부터 무엇인가 하면 될것 같은 느낌이 든다. 그래서 뒤에서 부터 값을 채우도록 문제를 접근해보자..
최근 친구들과 스터디를 시작하면서, 첫번째 과제로 Grafana, Prometheus를 활용한 모니터링 시스템을 구축하게 되어서, 이와 관련된 글을 작성해보려 한다. 구축할 시스템 아키텍처는 위의 그림과 같다. Springboot의 metric 데이터를 Prometheus가 가져가고, Prometheus가 모은 데이터를 Grafana가 시각화해준다. 여기서 Prometheus를 굳이 끼워야하나? 하는 의문을 가질 수 있는데 다음과 같은 장점이 있기 때문에 Prometheus를 사용하는 것이 좋다. Prometheus는 Spring Boot 외에도 여러 언어와 애플리케이션 프레임워크를 지원한다. 그리고 여러개의 애플리케이션을 Prometheus가 모니터링하면 동일한 Prometheus 서버에서 여러 메트릭..
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 먼저 나이브하게 문제를 접근해보자. 존재하는 곡괭이의 개수는 최대 15개이다. 그리고 광물의 개수는 50개이다. 곡괭이 무조건 5개의 광물을 캐야한다는 조건이 있다. 50개의 광물을 캐기 위해서는 10개의 곡괭이가 필요한 것을 알 수 있다. 즉, 최대 10개의 곡괭이만 사용하게 된다. 그러면 15개의 곡괭이 중 10개를 뽑는데 15C10의 시간복잡도가 소요된다. 그리고 뽑은 곡괭이를 최소값이 되도록 나열해야 하는데, 10!의 시간복잡도가 소요된다. 이 둘을 곱하면 절대 문제를 해결할 수 없다는 것을 알 수 있..
프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 귀찮았던 구현 문제이다. 주어진 조건대로 구현을 하면 되는데 주의할 부분이 하나 있다. 문제에서 요구하는 시뮬레이션 순서는 아래와 같다. 시간이 되면 새로운 과제를 시작한다. 새로운 과제를 수행할때, 기존에 수행하던 과제가 있으면 대기열로 해당 과제를 보낸다. 현재 진행중인 과제가 끝이 나면, 대기중인 과제를 이어서 수행한다. 이렇게 케이스를 나눠볼 수 있다. 사실 케이스를 더 쪼갤 수 있지만, 새로운 과제가 있다면 무조건 시작해야 하기 때문에, 조건문 순서를 잘 걸어두면 간소화할 수 있다. 대기열에 들어간 ..
Go언어에서 사용할 수 있는 GORM을 사용하다 보면, 자연스럽게 Soft Delete라는 개념을 마주치게 된다. 나에게는 좀 색다른 개념이였는데, DB에 데이터를 저장하는 한 가지 패턴이라는 것을 알게 되었고 오늘은 이에 대해 정리해보고자 한다. Go, GORM을 기준으로 정리할 것이다. import "gorm.io/gorm" type Users struct { gorm.Model Name string `gorm:"size:255"` Email string Password string } GORM의 Entity는 위와 같이 선언할 수 있다. 여기서 gorm.Model이라는 필드가 보이는데, 이는 GORM 측에서 제공하는 기본적인 모델 스키마이다. 그래서 이를 선언하면, 기본적으로 아래의 4가지 colu..
Channel 이란? Go 언어에서 Channel은 Goroutine 간의 통신을 위한 메커니즘이다. 채널은 데이터를 전송하는 파이프 역할을 하며, 고루틴들은 채널을 통해 데이터를 보내고 받을 수 있다. // a channel that only carries type (ex: int, string) ic := make(chan type) Channel은 make 함수를 사용하여 생성할 수 있으며, make (chan type) 형태로 작성한다. 여기서 type은 채널이 전송할 데이터의 타입을 말한다. 만약 int를 넣으면 int 타입의 데이터를 전송할 수 있는 채널을 만들겠다는 의미이다. ic