전체 글(106)
-
트랜잭션 전파 레벨(REQUIRES_NEW)의 함정과 이벤트 기반 해결
문제 상황요구 사항데이터를 저장한 뒤, 해당 데이터를 DB에서 불러와 Gemini API로 분석하는 기능을 구현하려 했습니다.필수적인 요구 사항은 Gemini API를 통한 데이터 분석은 매일 스케쥴러를 통해 이뤄지고 있고, 중요한 데이터가 아닌 부가적인 데이터이므로 분석이 실패하더라도, 앞서 저장한 데이터(분석 대상)는 안전하게 DB에 저장되어야 했습니다. 그래서 Gemini 분석 메서드만 따로 분리해 트랜잭션 전파 방식을 REQUIRES_NEW로 부여해서 Gemini 분석이 실패해 롤백되어도 원래 트랜잭션까지 롤백되지 않게 하려 했습니다. 발생한 에러/문제REQUIRES_NEW 메서드 내부에서 방금 저장한 데이터의 ID로 호출했으나, 데이터를 찾지 못하는 문제가 발생했습니다. 원인 분석REQUIR..
2026.08.13 -
백준 11004
문제 문제 접근N의 최댓값이 5,000,000이므로 O(NlogN)의 복잡도로 풀면된다.퀵 셀렉트의 경우 최악의 경우 시간복잡도가 O(N^2)이지만, 공부를 위해 이번에는 퀵 셀렉트 사용해서 문제를 풀어보기로 하였다.퀵 셀렉트는 퀵 정렬에서 한쪽만 골라 재귀하는 방법을 말한다. 매 정렬마다 pivot을 K와 비교하는데,pivot == K: K번째 수를 찾았으므로 알고리즘 종료pivot > K: pivot의 왼쪽부분에 K가 있으므로 왼쪽만 정렬 수행pivot : pivot의 오른쪽부분에 K가 있으므로 왼쪽만 정렬 수행위와 같은 조건으로 선택해서 정렬과정을 진행하면 된다. 코드 public static void main(String[] args) throws IOException { Buf..
2026.08.05 -
백준 11399
문제 문제 접근문제에서 나와있듯이 가장 짧은 시간이 걸리도록 순서를 세우고 그 값을 구해서 출력하면 된다.앞에 서있는 사람이 인출하는 데 걸리는 시간만큼 뒷사람의 인출시간도 늘어난다고 생각하면, 인출시간이 짧은 사람을 순서대로 앞에 세우면 최단시간이 걸린다는 걸 쉽게 알 수 있다. N의 최댓값이 1000이고 시간제한이 1초이므로 시간복잡도가 $O(N^2)$인 정렬 알고리즘 중 아무거나 사용해도 되므로, 이번 문제에서는 삽입 정렬을 이용해서 문제를 풀어보았다. 문제 풀이 public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(Sy..
2026.08.04 -
백준 1377
문제 문제 접근정렬이 완료되었을 때 i를 출력하면 되는데, 직접 버블정렬을 구현해서 문제를 해결하면 $O(N^2)$이기 때문에 시간이 초과된다. 그래서 버블 정렬의 특성을 이용해서 문제를 풀어야한다.버블 정렬은 정렬이 수행될 때마다 왼쪽으로 최대 한 칸씩 이동한다.그래서 처음 위치에서 왼쪽으로 몇 칸 이동했는지에 따라서 몇 회 정렬되었는지를 확인할 수 있다. 예를 들어서 주어진 배열이 [10, 1, 5, 2, 3] 이렇다면,정렬이 마무리되면 [1, 2, 3, 5, 10] 이다. (Java의 sort 메소드를 이용하면 N log N이다.)3번인덱스인 2를 기준으로보면 정렬이 마무리 되었을 때 인덱스가 1로 변경된다.그래서 왼쪽으로 2칸 이동했다는걸 알 수 있다. 그래서 정답은 각 원소의 인덱스 이동값을 비..
2026.08.04 -
우선순위 큐 (Priority Queue), 힙 (Heap)
우선순위 큐는 넣을 때는 자유롭게, 꺼낼 때는 항상 우선순위가 가장 높은 것부터 나오는 자료구조입니다.코드로 보면 아래와 같습니다.// 예시: 기본적으로 작은 값이 우선)PriorityQueue pq = new PriorityQueue();pq.add(5);pq.add(1);pq.add(3);System.out.println(pq.poll()); // 1System.out.println(pq.poll()); // 3System.out.println(pq.poll()); // 5// 예시: 내림차순으로 하고 싶을 때PriorityQueue pq2 = new PriorityQueue(Collections.reverseOrder());pq2.add(5);pq2.add(1);pq2.add(3);System.ou..
2026.07.14 -
백준 2164
문제 문제 접근문제 나와있는 반복되는 동작은 아래와 같다.1. 맨위의 카드 뽑아서 버리기2. 맨위의 카드 뽑아서 제일 아래에 넣기 위에서 뽑고 아래로 넣는게 눈에 바로 보이기 때문에 Queue 자료 구조를 사용하면 문제가 풀릴거라고 생각이 되고,깊게 생각할 부분도 없기 때문에 바로 코드로 구현하면 될 것 같다. 코드 구현 private static void 카드2() throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int N = Integer..
2026.07.14