일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 네트워크
- HashMap
- 프로그래머스
- 스프링
- 그리디
- 해시
- 이분탐색
- Algorithm
- programmers
- 해시맵
- dynamic programming
- Spring
- 너비우선탐색
- BFS
- 브루트포스
- Network
- 구현
- 깊이우선탐색
- switch
- 백준
- Backtracking
- 백트래킹
- 알고리즘
- DFS
- 부분수열의합
- greedy
- boj
- DynamicProgramming
- 동적계획법
- DP
- Today
- Total
목록2025/08 (10)
옌의 로그
문제[프로그래머스] 연속 펄스 부분 수열의 합 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 사용 알고리즘- Kadane's algorithm> 연속 부분수열(부분배열)의 최대 합을 O(n)에 구하는 전형적인 DP/그리디 기법해결방법주어진 수열을 돌면서 연속 합이 0보다 작아지면, 더하지 않고 새로 합계를 시작한다pulse를 적용하기 위해 1, -1을 가지는 배열을 전체적으로 감싸 수열의 값마다 펄스를 곱해서 처리 *Kadane algorithm더보기i번째 원소까지 봤을 때maxEndingHere = i에서 끝나는 최대합maxSoFar = 지금까지 본 전체 최대합을 유지하며 한 칸씩 전진 점화식:maxEndi..

본 포스팅은 스프링으로 시작하는 리액티브 프로그래밍 책을 참고하여 작성하였습니다. ( _ _) 리액티브 프로그래밍(Reactive Programming) 이란?리액티브 프로그래밍은 리액티브 시스템을 구축하는 데 필요한 프로그래밍 모델이다. 그렇다면 리액티브 시스템이란 무엇일까?reactive라는 단어의 사전적 의미가 '반응을 하는' 인 만큼, 리액티브 시스템이란 반응을 잘하는 시스템을 의미한다. 즉, 클라이언트의 요청에 머뭇거리지 않고 반응을 잘해서 즉시 응답해 주는 것을 의미한다. 리액티브 시스템의 설계비동기 메세지 기반 통신으로 동작해야 한다탄력적이고 회복성을 지녀야 한다높은 응답성을 지녀야 한다유지보수와 확장이 용이해야 한다 더보기리액티브 시스템에서 탄력성(Elastic)이란 시스템의 작업량..
최근 프로젝트에서 enum을 자주 사용하게 되면서, 한 가지 고민이 생겼다. 코드 상에서는 enum으로 깔끔하게 관리하고 싶은데DB에는 그 값이 int로 저장된다면? 예를 들어, 상품 상태(ProductStatus)를 enum으로 선언하고 있지만 DB에는 0, 1, 2 같은 숫자로 저장하는 구조였다. 그럼 이 숫자들이 도대체 뭘 의미하는지 코드만 봐서는 알기 어렵다. 이를 해결하기 위해 사용했던 방법들을 정리하고, 코드 테이블 방식까지 비교해보려 한다. 1. Enum의 순서(ORDINAL)를 그대로 사용하는 방식가장 간단하고 자주 쓰이는 방법이다. enum 선언 순서가 곧 DB의 숫자 값이 된다.@Getterpublic enum ProductStatus { READY, // 0 ..
문제[프로그래머스] 올바른 괄호사용 알고리즘- 스택 자료구조 (를 쓰지 않아도 가능) 해결방법'(' 이 나오면 스택에 데이터 인풋 (암거나 괜찮다)')' 이 나오면 스택에서 데이터 pop스택이 최종적으로 비어있다면 모든 쌍이 맞은 것으로 판단But? >> 스택을 쓰지 않고, 단순하게 int 변수 +- 로도 가능소스코드사용언어 : Java 1. stack 사용 코드class Solution { boolean solution(String s) { Deque st = new ArrayDeque(); for(char c : s.toCharArray()) { if (c == '(') st.push(1); ..
1. 구현 배경client 개발자들과 협업하며, api 마다 발생할 수 있는 에러 응답에 대해 ui로 편하게 볼 수 있게 할 목적으로 작업하게 되었다.Swagger config 빈이 생성될 때 OperationCustomizer가 동작해 자동으로 ErrorType enum을 읽어와 각 API에 해당하는 에러 코드 예시를 자동 등록하고, UI에서 보기 쉽게 표시하는 구조를 만들게 되었다. 2. 에러 코드는 관리에러 코드는 다음과 같이 enum으로 정의했다.public enum ErrorType { INVALID_PARAMETER(HttpStatus.BAD_REQUEST, 1001, "잘못된 요청입니다."), UNAUTHORIZED(HttpStatus.UNAUTHORIZED, 1002, "인증..
1. 시작은 ‘배치 서버’라는 이름이었다예전에 PHP로 서비스 개발을 하던 시절, 특정 시간마다 돌아가는 작업을 “batch”라고 불렀다.보통 crontab에 등록해두고, 새벽 1시에 포인트 정산, 3시에 푸시 발송 같은 걸 처리했는데그때는 이게 배치 작업이고, 이걸 돌리는 서버니까 배치 서버인 줄 알았다. Spring Boot로 넘어온 이후에도 마찬가지였다.Spring에서 @Scheduled만 붙이면 시간마다 메서드가 실행되니까 그걸 띄워두는 서버를 그냥 “배치 서버”라고 불렀다. 2. 나는 “스케줄링”만 했지, 진짜 “배치 처리”는 안 해봤다 Spring Batch를 공부하면서 놀랐다.내가 해왔던 건 단순히 “정해진 시간에 실행하는 작업”이었고,진짜 배치 시스템은 훨씬 더 복잡하고 구조화되어 있었다..
문제[프로그래머스] 네트워크사용 알고리즘- BFS (너비우선탐색)해결방법0 ~ 200 까지의 그래프를 BFS를 통해 몇 개의 네트워크가 존재하는지 찾는다bfs를 한 번 돌 때마다 연결된 노드들은 visited = true 체크가 되므로, bfs 실행 횟수가 네트워크 개수가 됨소스코드사용언어 : Javaimport java.util.*;class Solution { public int solution(int n, int[][] computers) { int answer = 0; boolean[] visited = new boolean[n]; for (int i=0; i q = new ArrayDeque(); visited[start] =..
1. 서론: 연관관계, 그리고 성능 고민최근에 투입된 프로젝트는 다양한 도메인 간에 1:N 관계가 아주 많은 구조를 가지고 있었다.상품과 카테고리, 유저와 구매내역, 상품과 메타데이터 등 대부분의 엔티티가 서로 깊게 연관돼 있었고,그 연관관계들이 곧바로 화면 응답이나 API 출력으로 이어지다 보니,JPA의 Lazy Loading, N+1 문제, fetch join, open-in-view 설정 같은 키워드들이 일상처럼 따라다녔다. 특히, 연관된 데이터를 DTO로 변환해야 하는 경우가 많았는데, 이때마다 트랜잭션이 이미 종료돼 있어서 Lazy 객체 접근 시 LazyInitializationException이 터지는 일이 많았다. 그 과정에서 자연스럽게 다음과 같은 질문이 생겼다:지연 로딩은 어떻게 최적화할..
DDD(Domain-Driven Design) ?DDD는 도메인(업무 규칙과 의미) 에 집중해서 시스템을 설계하자는 접근 방식이다.단순히 “이런 기능이 필요하다”는 시각이 아니라, 비즈니스의 언어와 규칙을 코드에 녹이는 것이 핵심이다. 주요 개념 정리개념설명예시 (상품 관리)도메인(Domain)해결하고자 하는 비즈니스 영역상품 등록, 메타데이터 수집, 발행엔티티(Entity)고유 ID가 있는 객체Product, Copyright밸류 오브젝트(Value Object)고유 ID 없이 값으로 의미ProductName, Price, Period애그리거트(Aggregate)엔티티들의 일관성을 묶는 루트Product가 루트, 내부에 ProductMetadata 포함도메인 서비스엔티티에 넣기 애매한 복잡한 비즈니스..
FCM 푸시 모듈 작업을 계기로 마주친 이벤트 기반 설계 이야기 1. 사용하게 된 배경최근 FCM을 활용한 푸시 알림 모듈을 구현하게 되었다.초기에는 단순히 서비스 로직 안에서 푸시 메시지를 생성하고 전송하는 sendPushMessage() 메서드를 직접 호출하는 방식으로 구현했는데, 이 방식에는 치명적인.. 구조적 문제가 있었다.푸시 메시지를 생성하고 저장하는 로직이 서비스의 트랜잭션 흐름에 함께 묶여서, 이로 인해 메세지 생성 트랜잭션이 롤백되면 메인 트랜잭션도 함께 롤백되는 상황이 발생하였다.(push는 로그 데이터 같이, 생성 실패하여 발송이 안되더라도 크게 문제없는 데이터인데 이로 인해 메인로직이 처리가 안되는 건 문제가 있는 상황이다) 물론 트랜잭션 전파 속성을 REQUIRES_NEW로 설정하..