전체 글(19)
-
[DATABASE] - 분산락(1)
문제 상황 🏆앞선 글에서 쿠폰 10장에 100명이 몰려 100장이 나갔고, DB 락으로 막았다. (lost update — 두 요청이 같은 재고를 읽고 각자 줄이면, 한쪽 갱신이 다른 쪽에 덮여 사라진다는 개념)이번엔 락을 DB까지 안 가고 애플리케이션에서 처리해봤다. synchronized 한 줄이면 되는 일이다.public void issue(Long couponId, Long userId) { synchronized (monitor) { issueService.issueWithoutLock(couponId, userId); }} 서버 한 대에서 100개 요청을 넣으면 정확히 10장이 나간다. 5라운드를 돌려도 10개씩 잘 발생된다. 잘 막힌 것 같았다.그래서 같은 코드를 인..
2026.08.02 -
[DATABASE] - 동시성 처리
문제 상황 🏆선착순 쿠폰 이벤트를 만들다가 이상한 걸 봤다. 재고를 딱 10장만 걸어놨는데, 동시에 100명이 요청을 넣자 100장이 전부 발급됐다. 10장 한정이라고 코드에 분명히 써놨는데도 그랬다. 처음엔 테스트를 잘못 짠 줄 알았다. 그런데 100번을 다시 돌려도 결과가 똑같았다. 운 나쁠 때 가끔 새는 게 아니라, 매번 전부 샜다. 더 이상한 건 재고 테이블이었다. 발급 내역(coupon_issue)은 100건이 쌓였는데, 재고(coupon_stock)에는 9장이 남아있다고 찍혀 있었다. 100장이 나갔으면 재고는 0이거나 못해도 마이너스여야 하는것이 아닌가??coupon_issue 행 개수 : 100coupon_stock quantity : 9발급 100, 재고 9, 정원 10. 세 숫자 중 ..
2026.07.29 -
[프로그래머스] 보석 쇼핑
문제진열된 보석들 중 모든 종류의 보석을 적어도 하나 이상 포함하는 가장 짧은 구간을 찾아야 한다.조건은 다음과 같다:보석의 진열 순서가 담긴 문자열 배열 gems가 주어진다.진열된 보석들을 연속적으로 선택한 구간 중, 모든 보석 종류를 한 번 이상 포함하는 가장 짧은 구간의 시작과 끝 인덱스를 반환한다.정답이 여러 개인 경우, 시작 인덱스가 가장 작은 구간을 반환한다.풀이 방법풀이 시간 : 1시간풀이 방법 : 투포인터 + 해시맵 (슬라이딩 윈도우) 반환 타입을 보자마자 이건 투포인터구나! 라는 생각을 했다.그리고 문제에 나와있는대로 모든 종류를 포함해야 한다는 조건때문에 Set과 HashMap을 이용해 중복에 대한 처리를 진행하거나, 갯수에 대한 처리를 진행할 수 있을 것 같다는 생각을 하고 들어갔다...
2025.06.04 -
[프로그래머스] 다리를 지나가는 트럭
문제트럭 여러 대가 순서대로 다리를 지나가야 한다. 단, 다리는 bridge_length 만큼의 길이를 가지며, 동시에 올라갈 수 있는 트럭의 무게 합은 weight를 넘지 않아야 한다. 트럭은 1초에 1만큼 이동, 다리에 올라간 순서대로 움직인다. 모든 트럭이 다리를 건너는 데 걸리는 최소 시간을 구해야한다.풀이방법풀이 시간 : 30분풀이 방법 : 시뮬레이션 + 큐(Queue) 처음에는 단순히 다리 길이나 무게 제한만 고려해서 트럭을 올릴 수 있는지 판단하면 된다고 생각했다.하지만 다리 위에서 트럭이 동시에 이동하고, 무게 제한도 유지하며 매 초마다 트럭이 한칸씩 이동한다는 점에서 단순 조건문으로는 해결할 수 없었따. 예를 들어,더보기bridge_length = 2 weight = 10 truc..
2025.06.03 -
[프로그래머스] 땅따먹기
문제아래로 내려가면서 점수를 가장 많이 얻을 수 있는 경우를 찾는 것이다. 하지만 같은 열을 반복해서 밟을 수는 없다. 풀이방법풀이 시간 : 30분풀이 방법 : DP 맨 처음에는 0번째 행에서 제일 큰값을 찾아서 아래에서 같은 열이 아닌것 중 가장 큰걸 찾으면 되는 줄 알았다.근데 생각해보니 0번째 행에서 선택되는 값에 따라 달라진다는걸 알 수 있었다. 예를 들어,129108791154882344 라는 그래프가 있을때 내가 맨처음에 생각했던 방식은 위와 같다고 생각했는데, 129108791154882344위와같은 방식의 점수합이 더 크다는걸 알 수 있었다.그래서 DP를 생각했고, 그냥 1번째 행부터 현재 0,1,2,3열에서 바로 윗 행의 가장 큰값을 더해오면 된다. 1행 0열에서 자신과 열이같은 바로 윗..
2025.05.29 -
[프로그래머스] 미로 탈출
문제미로의 출구를 찾아 최단 경로로 탈출하는데, 중간에 레버를 당기고 탈출해야하는 문제이다.풀이방법풀이 시간 : 20분풀이 방법 : BFS BFS를 이용해 최단 경로를 만들어주면 되는데 레버를 당기는게 이 문제의 핵심이다.쉽게는 그냥 시작점 -> 레버 + 레버 + 탈출구의 경로를 찾아 더해주면 된다.코드import java.io.*;import java.util.*;class Solution { static final int[] dx = {1, -1, 0, 0}; static final int[] dy = {0, 0, -1, 1}; static int n, m; static char[][] map; public int solution(String[] maps) { ..
2025.05.26