본문 바로가기

분류 전체보기200

[프로그래머스] Lv3 - 최적의 행렬 곱셈 풀이 방법단순 무식하게 브루트 포스 방법으로 구현하니, 시간 초과가 발생했습니다.왜 시간 초과가 발생할까요? 행렬이 1개일때부터 한개씩 늘리면서 몇개의 경우가 생기는지 알아보겠습니다. 행렬이 1개인 경우A 행렬을 곱할 수 없습니다.  행렬이 2개인 경우는 1가지 입니다.A x B 행렬이 3개인 경우엔 2가지로 나뉩니다.(A x B) x C A x (B x C) 행렬이 4개인 경우엔 5가지로 나뉩니다.(A x B) x (C x D)((A x B) x C) x D(A x (B x C)) x D A x ((B x C) x D) A x (B x (C x D)) N개의 행렬이 있는 경우엔 아래와 같은 점화식을 따르게 됩니다. 문제에서 주어진 n의 최대 갯수는 200입니다.(400)! / (201)! x 200!을.. 2025. 2. 25.
@Transactional 원리 @Transactional은 어떤 원리로 실행되는 걸까?  이번 글에서는 커스텀 어노테이션, AOP, 그리고 TransactionManger를 활용하여 @Transactional과 유사한 기능을 가지는 커스텀 어노테이션을 직접 구현해 보고, 이를 통해 @Transactional의 원리에대해 정리했습니다.  먼저, @Transactional과 같은 역할을하는 커스텀 어노테이션 @Sangyunpark을 만들어 보겠습니다.  커스텀 어노테이션을 아래와 같이 만들어 줍니다.@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface Sangyunpark {}  @Sangyunpark이라는 어노테.. 2025. 2. 25.
[프로그래머스] Lv 3. 블록 이동하기 문제 풀이 방법 로봇이 (N,N) 위치까지 이동하는데 필요한 최소 시간을 구해야 합니다.탐색을 하는데 같은 가중치(= 모든 이동이 같은 비용)를 가지면서 최단 거리를 구하는 문제에서 BFS를 사용한다고 생각했습니다. 문제는 로봇이 한칸을 차지하는 것이 아닌 2칸을 차지하는 것과 90도로 회전도 가능하다는 점입니다.로봇은 아래와 같이 생겼습니다. 로봇이 이동할 수 있는 경우는 상,하,좌,우 4가지와 90도 회전이 있습니다.90도 회전은 현재 로봇의 모양이 가로인지 세로인지에 따라 달라집니다. 어떻게 달라질까요? 먼저, 로봇이 가로 방향으로 놓였을 때, 회전할 수 있는 방향은 다음과 같습니다.현재 로봇의 위치가 (y1,x1),(y2,x2)인 경우 회전을 하기 위해 확인해야 할 칸은 살구색으로 색칠한 부분 입.. 2025. 2. 24.
Redis로 동시성 제어하기 "동시성 제어를 redis로 관리할 수 있을까?"  이번 글은 레디스를 사용한 락 관리 방법인 Lettuce와 Redisson에 대해 알아보겠습니다.아래 내용은 "재고시스템으로 알아보는 동시성 이슈 해결방법" 강의를 참고해서 작성했습니다. 아래와 같은 상황을 가정하겠습니다.독거미 키보드가  1000개를 50%할인 이벤트를 열었습니다.이벤트가 시작되자마자 엄청난 트래픽이 몰리면서 1000개의 구매 요청이 들어왔습니다.그러나, 1000개의 구매 요청이 완료됬음에도 재고가 전부 소진되지 않는 문제가 발생했습니다.신입 개발자 민수씨는 이 상황에 어리둥절 합니다. 신입 개발자 민수씨는 다음과 같은 로직으로 재고 소진 기능을 구현했습니다.package com.example.redis_stock_management... 2025. 2. 24.
펜윅 트리 펜윅 트리(Fenwick Tree)가 뭘까요? 펜윅트리는 가장 낮은 비트(LSB)를 기반으로 트리를 만들어 동적배열에서 구간합을 효율적으로 구할 수 있는 자료구조입니다.또한 이진 인덱스 트리(Binary Indexed Tree, BIT)라고도 불립니다. 동적 배열이 뭘까요? 정적 배열은 배열의 요소들이 한번 선언되면, 바뀌지 않는 배열을 의미합니다.동적 배열은 동적으로 배열의 요소들이 바뀌는 배열을 의미합니다. 정적 배열과 동적 배열의 예시는 아래와 같습니다.정적 배열 : [10,20,30,40,50]  동적 배열 : [10,20,30,40,50] → [10,30,60,20,50]  백준에서는 아래와 같은 표현으로 동적 배열의 구간합을 구하라고 합니다."다섯 번째 수를 2로 바꾸고 3번째부터 5번째까지 .. 2025. 2. 23.
최대 증가 부분 수열 최대 증가 부분 수열(LIS)이 뭘까요?  최대 증가 부분 수열(Longest Increasing Sequence)은 오름 차순으로 증가하는 부분 수열 중 가장 긴 부분 수열을 의미합니다.하나의 예시를 통해서 알아보겠습니다.10 20 30 10 40 50 오름 차순으로 증가 하는 부분 수열 중 가장 긴 부분 수열은 어떻게 될까요? 10 20 30 20 40 50 [10,20,30,40,50]이 됩니다. 중간에 20이 있는데 오름 차순으로 증가하는 부분 수열이 아니지 않나요?10 20 30 20 40 50 [10,20]도 오름 차순으로 증가하는 부분 수열입니다. 어떤 부분 수열 배열이 최대 증가 부분 수열일까요? [10,20,30,40,50]은 길이가 5인 부분 수열이고, [10,20]은 길이가 2인 부분.. 2025. 2. 22.
OSIV JPA를 쓰면서 어디선가 많이 들어봤는데.. OSIV가 뭐지? 이번글은 OSIV에 대해 알아보겠습니다. OSIVOSIV(Open Session in View)는 영속성 컨텍스트를 뷰까지 유지하는 기능입니다.즉, 영속성 컨텍스트가 닫히기 전에 컨트롤러나 뷰에서도 엔티티를 영속 상태로 유지할 수 있어, 지연 로딩이 가능해집니다. OSIV는 과거에 지원했던 방식과 현재 Spring에서 지원하는 방식에 차이점이 존재합니다.먼저, 과거에 사용되었던 OSIV 방식에 대해서 살펴보겠습니다.  과거에 사용된 OSIV 과거에 사용되었던 OSIV 방식은 요청 단위 트랜잭션을 유지하는 방식이였습니다.즉, HTTP 요청이 시작될 때 트랜잭션을 열고, 응답이 완료되는 경우 트랜잭션을 닫는 구조였습니다. 흐름을 이미지로 나타내면.. 2025. 2. 21.
[프로그래머스] Lv3 카운트 다운 문제 풀이 방법 문제에선 구하라고 하는 값은 최선의 경우 던질 다트 수(최솟값)와 그 때의 싱글 또는 불을 맞춘 횟수(합)을 순서대로 배열에 담으라고 합니다. 다트를 던지는 방법은 싱글, 2배, 3배, 불 이렇게 4가지의 방법이 있고 최솟값을 구하라는 문제에서 백트래킹 + DP 알고리즘을 생각했습니다. 백트래킹 + DP 알고리즘은 몇몇 테스트는 통과를 했지만, 런타임 예외가 발생했습니다.   문제에서 target이 100,000이기도 하고 DFS를 사용한 경우 한 depth가 늘어날때마다 4개의 경우로 분기가 되기 때문에 재귀 호출이 매우 깊어집니다. 백트래킹을 적용할 시 이미 방문한 상태보다 더 나은 경우만 탐색해야 하지만, 싱글/볼을 최대로 하는 조건까지 고려하는 경우엔 백트래킹을 적용한다고 해도 경.. 2025. 2. 20.
프록시 객체 JPA는 어떻게 지연 로딩(Lazy Loading)을 사용할 수 있을까요? 이번 글은 JPA의 프록시에 대해 알아보겠습니다. 프록시가 무엇일까요? 프록시프록시는 실제 엔티티 객체 대신 데이터베이스 조회를 지연시킬 수 있는 가짜 객체입니다.  데이터베이스 조회를 지연시켜야 하는 이유가 뭘까요? 데이터베이스 조회를 지연시키지 않은 경우엔 하나의 엔티티를 조회할때, 그 엔티티와 연관된 다른 엔티티들의 데이터도 함께 조회하게 됩니다. 만약, 조회한 엔티티만 사용되고 연관된 다른 엔티티들은 필요하지 않은 경우, 실제로 사용되지 않는 데이터까지 불필요하게 조회하게 됩니다. 이능 성능 저하로 이어질 수 있고, 불필요한 리소스 낭비를 초래할 수 있습니다. 이 상황을 코드를 통해 알아보겠습니다.Member엔티티와 Tea.. 2025. 2. 20.