전체 글 157

선착순, 재고 시스템 관리 인프런 정리

선착순 이벤트 시스템 관련해서 Ex) 100개의 쿠폰을 발급한다고 했을 때db로만 쿠폰 발급 로직을 조절할 경우 race condition 발생으로 인해 100개보다 더 많은 쿠폰이 발급될 수 있음 Redis 도입가장 떠올리기 쉬운 방법은 java의 synchronized 키워드를 사용해서 access를 동시에 하는 것을 막는 건데 사실 이 방법의 가장 큰 문제점은 여러 대의 서버를 띄울 경우 무용지물인 부분이다. (하나의 서버에 들어온 여러 개의 동시 접근을 막아주는 것이기 때문)  그렇다면 레디스 도입을 통해 문제를 해결하는데 레디스에는 incr라는 명령어가 있음1 증가시키면서 증가시킨 값을 가지고 온다. 가지고 온 값이 100이 넘었을 경우 쿠폰을 발급하지 않도록 한다. 카프카 도입레디스에 저장된 ..

공부공부 2025.03.01

[leetcode] 202. Happy Number

문제주어진 number는 각 자릿수의 제곱을 더한 값으로 할당되는데 number가 1이 되면 happy number끝나지않는 반복에 빠지면 happy number가 아니다. 풀이happy number를 구하는 건 쉽지만 happy number가 아닌 수를 구하는 건 끝나지않는 반복에 빠져있는지에 대한 별도의 체크가 필요하다.이 체크는 어떻게 해도 상관없지만 나는 map을 이용해서 구현했다.'2^31 - 1 크기의 boolean 배열'로 선언해서 이미 number였던 값이었는지를 체크해도 되는데, 반복되는 수만 체크해도 되기 때문에 불필요하게 배열 사이즈를 키울 필요는 없다고 판단했다. 하지만 배열을 쓰기에는 해당 number가 happy number인지 판단하는 과정에서 얼마나 많은 연산을 할 지는 알 ..

코딩테스트 2025.03.01

[leetcode] 168. Excel Sheet Column Title

문제171. Excel Sheet Column Number 와 풀이가 반대되는 문제이다. A -> 1B -> 2..Z -> 26AA -> 27.. 위와 같이 주어졌을 때, 입력 숫자와 상응하는 문자열을 반환한다. 풀이n이 자릿수이고, A를 A~Z에 해당하는 숫자(1~26)라고 했을 때, 26으로 나눠가며 나머지부터 알파벳으로 바꿔간다. 풀이 코드위의 풀이를 그대로 코드로 옮겨온 모습이다.class Solution { public String convertToTitle(int columnNumber) { StringBuilder sb = new StringBuilder(); while(columnNumber > 0) { columnNumber--; ..

코딩테스트 2025.03.01

[leetcode] 11. Container With Most Water

11. Container With Most Water Greedy 카테고리에서 첫 문제였는데, 백준에서 푼 기억이 있다. (아닌가..?) 풀이 코드는 총 두 개인데 하나는 5ms, 다른 하나는 4ms이다. 1. 첫 풀이 이중 for문을 돌려서 앞에서부터 마지막 기둥 간의 면적을 모두 체크해야한다고 생각했다.단순히 길고 높은 기둥이 시작 혹은 마지막에 있다고 해도 적당히 짧고 긴 기둥들과 기둥 간의 거리가 생각보다 멀면 면적이 훨씬 넓게 나올 수 있기 때문이다. 다만 시작에 위치하게 될 기둥의 길이가 앞서 체크했던 기둥보다 짧을 경우엔 체크하지 않도록 했다.배열의 길이가 최대 10^5이기 때문에 스킵할 조건을 체크해주는 게 중요하다고 생각했다. 이러한 로직으로 풀이하게 될 경우 통과할 수는 있지만 최악의 ..

코딩테스트 2025.01.15

4. Median of Two Sorted Arrays

문제  1. 이미 정렬되어있는 두 개의 배열 nums1, nums2가 주어졌기 때문에 요소를 각각 비교하며 하나로 합친다.2. 홀수의 경우 중앙에 있는 수, 짝수의 경우 중앙에 있는 두 개의 수를 2로 나눈 수를 반환한다. class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int size = nums1.length + nums2.length; int[] nums = new int[size]; int index1 = 0; int index2 = 0; for(int i = 0; i

코딩테스트 2024.09.01

[leetcode] 1657. Determine if Two Strings Are Close

문제 1. 문제 해석두 string이 close한지 판단하는 문제 close 한 기준은 두 개의 operation을 시도했을 때 부합했을 경우이다.Operation 1: 두 개의 요소의 위치를 바꾸었을 때For example, abcde -> aecdbOperation 2: Operation1을 기반으로 한 글자의 위치에 다른 글자로 모두 대체하고 반대로도 시행했을 경우For example, aacabb -> bbcbaa (all a's turn into b's, and all b's turn into a's)부합할 경우 true, 아닐 경우 false 2. 문제 풀이 방향주어진 두 개의 string의 character와 character's occurence를 조사한다. 조사한 두 string의 cha..

코딩테스트 2024.08.24

[leetcode] 80. Remove Duplicates from Sorted Array II

문제/**오름차순으로 정렬된 배열이 주어지고 다른 배열을 생성하지 않은 채 배열 내 중복값 일부를 삭제하는 문제인데,적어도 두 개 이상 존재하는 요소를 삭제하는 문제입니다.어떤 언어에서는 배열의 크기를 줄이는게 불가능하기 때문에 만약 중복값을 제거한 후 k개의 요소가 있다면 앞쪽 k개의 배열 요소만 체크합니다.그렇기 때문에 k개 이후부터는 뭐가 있든 상관없음1, 1, 1, 2, 2, 31이 3개이기 때문에 하나를 삭제2는 2개이므로 그대로3은 1개이므로 2개보다 작아서 그대로1, 1, 2, 2, 30, 0, 1, 1, 1, 1, 2, 3, 30이 2개이므로 그대로1은 4개이므로 2개 삭제2는 1개로 2개보다 작아서 그대로3은 2개이므로 그대로0, 0, 1, 1, 2, 3, 3 -> 7개이전값을 고려하되 ..

코딩테스트 2024.08.03

[leetcode] 26. Remove Duplicates from Sorted Array

문제 class Solution { public int removeDuplicates(int[] nums) { int index = 0; for(int num: nums) { if (index nums[index - 1]) { nums[index] = num; index++; } } return index; }}  Set, List 써서 푸는 풀이/** Set으로 nums를 하나씩 체크 이후 nums에 앞에서부터 Set에 있는 elements를 하나씩 넣어주기 다만 Set의 경우 입력한 순서를 보장하고 있지 않기 때문에 List로 정렬..

코딩테스트 2024.08.03