분류 전체보기 410

[leetcode - 274. H-Index] java

문제 설명1. 배열이 주어진다.2. H-Index 란 내 논문의 인용수에서 n번 이상 된 것의 갯수가 n개 이상이 되는 최대의 n이다.3. H-Index 를 구하면 된다.풀이 과정 1. 그리?디? 솔직히 걍 구현같다.2. 최대 인용수를 구해서 거기서부터 확인해 본다.3. 지금 논문의 인용수 n 이상의 논문 갯수를 보고, 이게 n보다 크거나 같으면 정답이 된다. (내림차순이므로 최대 보장)4. pq 에 논문을 reverseOrder 로 저장하고 size를 확인하면 쉽게 구할 수 있다.코드class Solution { public int hIndex(int[] citations) { // 인용이 많이 된 것부터 저장한다. PriorityQueue pq = new Priority..

알고리즘 공부 2025.01.29

[leetcode - 45. Jump Game II] java

문제 설명1. 배열이 주어진다.2. 최대 거기 적힌 숫자만큼 점프할 수 있다.3. 목적지에 도달할 수 있는 최소 점프 갯수를 구하면 된다.풀이 과정 - DP 문제인데, 그냥 이중 for문으로 푸니까 쉬웠는데 문제에서 원했던 것은 하나의 for문으로 푸는 것 같았다.- 그래서 문제를 살펴보니(DP라는건 최소를 구하는 배열이니 미리 알고있었어서 이를 통해서 구하는걸로 마음먹음) 한번에 갈 수 있는 위치 중 가장 먼 위치가 목적지가 된다면, 그게 정답이라는 것이었다.풀이 과정은 다음과 같다.1. 먼저 현재 위치에서 점프할 수 있는 최대 거리를 구한다.2. 그리고 과거에 점프해서 도달했던 최대 거리가 지금 위치라면3. (1)에서 구한 최대 거리가 다음번의 최대 거리가 될 것이고4. 목적지에 도달하기 위해서는 점..

알고리즘 공부 2025.01.28

[leetcode - 55. Jump Game] java

문제 설명1. 배열이 주어진다.2. 최대 거기 적힌 숫자만큼 점프할 수 있다.3. 목적지에 도달할 수 있는(목적지에 정확히 가거나 그 이상)지 확인하면 된다.풀이 과정 1. 간단한 DFS 문제이다.2. 지금 위치에서 갈 수 있는 모든 곳을 가면서 체크해준다.3. 그리고 거기서 또 다음 위치로 가서4. 도달한 곳이 목적지 혹은 그보다 더 갔으면 true이다.5. (2) 과정에서 이전 경우에 이미 도달했을 수도 있다. 그러면 애는 더이상 체크할 필요가 없다.코드class Solution { private static boolean check[]; private static boolean ans; public boolean canJump(int[] nums) { check = ne..

알고리즘 공부 2025.01.28

[leetcode - 135. Candy] java

문제 설명1. 배열이 주어진다.2. 모든 학생은 사탕을 최소 1개 이상을 가진다.3. 양 옆 학생 중 나보다 점수가 낮은 녀석들 보다는 사탕을 많이 가져야 한다.3-1. 참고로 나랑 점수가 같으면 어떨지는 상관이 없다.풀이 과정 1. 무조건 사탕을 1개만 받는 사람들을 큐에 넣는다. (양옆이 모두 나보다 크거나 같은 경우)2. 그 사람들부터 시작해서 오른쪽 왼쪽 모두 찾는다.3. 다음에 찾은 친구의 점수가 이전 친구보다 높다면, 사탕을 그보다 1개 이상 더 가지고 있어야 한다.4. 그런데, 그 높은 친구의 반대쪽에도 더 점수가 낮은 학생이 있을 수 있다.5. 우리는 이미 모든 위치에서 찾기로 했다. 결국 최종적으로 어떤 학생은 양옆보다 큰 숫자를 가지고 있으면 된다.6. 이렇게 해서 구한 모든 사탕을 더..

알고리즘 공부 2025.01.28

[leetcode - 189. Rotate Array] java

문제 설명1. 배열이 주어진다.2. k 만큼 오른쪽으로 이동 + 배열 크기 넘어가면 처음으로 돌아오게 처리한다.풀이 과정 - 11. 결과를 저장하는 배열을 만들어서 옮겨주면 된다.2. k번 움직일 필요 없이 최종 결과로 가면 된다.코드class Solution { public void rotate(int[] nums, int k) { // 저장용 int save[] = new int[nums.length]; k %= nums.length; // k 숫자가 크면 배열만큼 이동하도록(어차피 배열 이상 가면 돌아옴) for(int i=0; i 요렇게 했는데... 어째 성능이 낮게 나왔다.그래서 빠른 풀이를 봤는데 와 미쳤다 소리가 나왔다. 풀이 과정 - 21...

알고리즘 공부 2025.01.27

[leetcode - 80. Remove Duplicates from Sorted Array II] java

문제 설명1. 배열이 주어진다.2. 중복을 제거한다.3. 근데 한번의 중복까지는 허용한다.풀이 과정1. 그냥 하나씩 더해가면서 구하면 된다.2. 한번의 중복은 허용하기 때문에 한번 허용했다는 flag를 만들고 활용하면 된다.3. 시작할 때에 index 에 대한 flag는 아직 없기 때문에 이에 대한 방어로직을 처음에 작성해주면 된다.코드class Solution { public int removeDuplicates(int[] nums) { // index 확인 int index = 0; boolean canDup = true; // 중복 추가 허용 여부. 처음 인덱스에 대해서는 중복 추가 가능 true // 처음꺼는 이미 들어가니까 1부터 ..

알고리즘 공부 2025.01.26

쿠버네티스 기본 개념 간략정리

쿠버네티스 기본 개념노드의 개념마스터 노드클러스터를 관리한다.워커 노드파드가 실행된다.인그레스 노드클러스터 외부에서 클러스터 내부의 파드에 접근할 때 로드밸런서의 역할을 해준다.여기서 받아서 어떤 endpoint 로 가야할지를 판단해서 보내준다.쿠버네티스 리소스크게 오브젝트와 컨트롤러로 구성되어 있다.오브젝트네임스페이스, 파드, 서비스 등이 있다.네임스페이스클러스터 내부를 논리적 단위로 구분하여 사용할 수 있도록 해준다.네임스페이스를 사용하면 pod, controller, service, ingress 등 용도에 따라 실행해야 하는 애플리케이션을 하나의 클러스터 내에서 구분해서 사용할 수 있게 된다.클러스터를 실행하면 기본적으로 kube-system(시스템에서 관리하는 네임스페이스), default(사용..

배민 Kafka를 활용한 이벤트 기반 아키텍처 구축 보고 정리

https://www.youtube.com/watch?v=DY3sUeGu74M 이거 보고 정리이벤트 기반 아키텍처를 왜 구축했냐?배달 + 알림, 통계 등등...근데 알림이나 통계는 배달이랑 강한 일관성을 가지지는 않는다.둘을 같이 동시에 만족할 필요는 없음. (준 실시간성으로도 ㄱㅊ)즉 이는 결과적 일관성으로 만족할 수 있다. (이벤트를 통해 변경사항을 처리)그래서 이벤트는 어떤 정보를 가지고 있어야 했는가?여기서는 배달의 변경 사항을 잘 알려주는 것이다.4가지 구성요소 - 대상, 행동, 정보, 시간대상 : 식별자 정보 제공(배달이 A라이더에게 11시에 배차되었다)행동 : 이미 벌어진 사건이므로 과거형으로 표현(배달이 A라이더에게 11시에 배차되었다)정보 : 행위와 관련된 값들을 표현 (배달이 A라이더에..

L4, L7

L4, L7둘 다 네트워크에서 패킷을 처리하는 방법을 나타낸다.OSI 7계층을 알면 좋음.L4기능전송 계층에 해당한다.주로 TCP, UDP 를 사용해서 데이터를 전송한다.송신자와 수신자의 IP주소 및 포트 번호를 기반으로 네트워크 트래픽을 전달한다.로드 밸런싱L4 로드 밸런서는 트래픽을 IP주소와 포트 번호를 기준으로 분산한다.그래서 요청을 여러 서버에 고르게 분산시킬 수는 있지만 요청의 내용은(헤더나 데이터를 통한 확인) 검사하지 않는다.장점속도가 빠르고 비교적 간단한 처리다양한 종류의 트래픽(TCP/UDP 등) 처리 가능제한위에서 보듯 포트 번호를 기준으로 분산하고 헤더나 데이터 분석을 하지 않아서 애플리케이션 상태 혹은 사용자 세션에 기반한 로드 밸런싱은 어렵다.L7기능애플리케이션 계층에 해당한다...

쿠버네티스에서 말하는 Stateless가 뭘까?

쿠버네티스에서 말하는 Stateless가 뭘까?데이터 독립성상태가 없다 == 자체적으로 데이터를 저장하지 않는다.즉, 모든 트랜잭션이나 요청을 독립적으로 처리하며 이전 요청의 데이터를 보존하지 않는다.데이터는 주로 외부 DB, cache 혹은 다른 저장소에 저장된다.따라서 애플리케이션 파드는 재시작되거나 스케일 아웃되더라도 데이터 손실에 영향을 받지 않는다.수평 확장이 용이하다.파드간 상태 공유가 필요없기 때문에 오토스케일링이 쉽다.각각 파드의 요청 처리도 독립적으로 가능하다.유연한 배포 및 업그레이드애플리케이션 배포 및 업그레이드 시, 파드의 교체 시 유저에게 영향이 없다.간단하게 말하면 데이터 저장이나 이전 상태 유지를 하지 않는 애플리케이션을 의미한다.위의 장점을 정리하면독립성 : 이전 요청과의 연..