전체 글 115

Java의 Integer.parseInt(String s, int radix)을 이용한 진수표현

Java에서는 Integer.parseInt(String s)을 통해 문자열을 정수형으로 변환할 수 있습니다.흔히 문자열을 10진수로 파싱해주는 Integer.parseInt(String s) 꼴을 주로 사용하지만,Integer.parseInt(String s, int radix)을 이용하면문자열을 지정한 진법(radix)로 해석하여 10진수 정수값으로 변환할 수 있습니다. 예시// 2진수 → 10진수int num = Integer.parseInt("1010", 2);System.out.println(num); // 10 https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String,%20int) Inte..

코딩테스트 2026.08.10

[알고리즘] MST(Minimum Spanning Tree)

코딩테스트에서 그래프 문제를 풀다 보면 "모든 정점을 최소 비용으로 연결하라"라는 문제가 등장하곤 한다.대표적인 예가 프로그래머스의 섬 연결하기인데, 이런 문제에서는 최소 신장 트리(MST) 알고리즘을 사용한다.MST란?MST(Minimum Spanning Tree)는모든 정점을 연결하면서 비용의 합이 최소가 되는 트리이다. MST는 다음 세 가지 조건을 만족해야 한다.모든 정점 연결사이클이 없어야 함연결 비용의 합이 최소예를 들어0 --1-- 1| /4 2| /2 가능한 연결 방법은 여러 가지가 있지만,0 - 1 (1)1 - 2 (2) 를 선택하면 총 비용은 3이 되고, 이것이 MST이다.언제 MST를 떠올려야 할까?문제에서 다음과 같은 표현이 보이면 MST를 의심해 볼 수 있다.모든..

코딩테스트 2026.07.24

3. 알림 조회 성능 개선 - 동시성

본 게시물은 트래블록스 프로젝트를 진행하며 발생한 문제 및 개선 사항을 정리한 글입니다. https://hyomee2.tistory.com/133 2. 알림 조회 성능 개선 - 반정규화본 게시물은 트래블록스 프로젝트를 진행하며 발생한 문제 및 개선 사항을 정리한 글입니다. https://hyomee2.tistory.com/132 1. 알림 조회 성능 개선 - 인덱스본 게시물은 트래블록스 프로젝트를 진행하hyomee2.tistory.com 앞선 글에서는 반정규화를 이용하여 병목이었던 COUNT 집계 쿼리를 제거하고 알림 목록 조회 API의 응답 시간을 개선했다.하지만 반정규화를 적용하며 또 다른 문제를 마주했다.바로 동시성 문제다!문제 상황예를 들어 현재 특정 사용자의 notification_count(알..

projects/travlocks 2026.07.06

2. 알림 조회 성능 개선 - 반정규화

본 게시물은 트래블록스 프로젝트를 진행하며 발생한 문제 및 개선 사항을 정리한 글입니다. https://hyomee2.tistory.com/132 1. 알림 조회 성능 개선 - 인덱스본 게시물은 트래블록스 프로젝트를 진행하며 발생한 문제 및 개선 사항을 정리한 글입니다. 배경초기 알림 테이블(notifications)에는 별도의 인덱스가 없이 설계되었지만, 대용량 환경을 대비해hyomee2.tistory.com 앞선 글에서는 인덱스를 이용해서 조회 쿼리 시간을 크게 단축시킬 수 있었다.하지만 실제 사용자가 체감하는 것은 쿼리 실행 시간이 아니라 API 응답 시간이므로,실제 서비스 관점에서 성능을 검증하고자 k6을 이용해 부하테스트를 진행했다. 부하테스트import http from 'k6/http';im..

projects/travlocks 2026.07.03

1. 알림 조회 성능 개선 - 인덱스

본 게시물은 트래블록스 프로젝트를 진행하며 발생한 문제 및 개선 사항을 정리한 글입니다. 배경초기 알림 테이블(notifications)에는 별도의 인덱스가 없이 설계되었지만, 대용량 환경을 대비해 안정적인 성능을 유지할 수 있도록 최적화가 필요하다고 판단했다.따라서 1차적으로는 복합 인덱스를 통해, 2차적으로는 Covering Index 전략을 이용해 조회 성능을 최적화하려 했다.커서 기반 페이징을 이용했기에 사용한 SQL문은 아래와 같았다.SELECT notification_id, created_at, actor_id, actor_nickname_snapshot, receiver_id, template_id, typeFROM notificationsWHERE receiver_id = 1ORDER BY..

projects/travlocks 2026.07.03

[프로그래머스] #42897 도둑질, 원형 DP

https://school.programmers.co.kr/learn/courses/30/lessons/42897 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 해당 문제의 핵심은 "원형 구조를 어떻게 처리할 것인가" 이다.집들이 원형으로 배치되어 있으므로, 0번 집을 털고 마지막 집도 터는 경우는 불가능하다.따라서 경우를 나눠줘야 한다. 1. 0번 집을 터는 경우- 마지막 집은 선택할 수 없다.- 따라서 탐색 범위는 0 ~ (length -2)가 되고for (int i = 2; i - 훔칠 수 있는 돈의 최댓값은 아래와 같다.dp[money.length - 2] 2. 0번 집을 털지 않는 경우- 마지막 집을 ..

[백준] #9205 맥주 마시면서 걸어가기, BFS

https://www.acmicpc.net/problem/9205 시도 1처음에 제출한 코드는 아래와 같다.문제를 읽고 생각해보면서, 좌표와 좌표 사이의 거리가 1000 이하면 되는 문제네? 라고 생각하면별도의 알고리즘 없이 구현하는 문제라고 생각했다.여기서 내가 잘못 생각한 점은 주어진 편의점을 "순서대로" 방문하는 것이 아니라 방문 순서를 정할 수 있는데, 그 점을 놓쳤다.또 아래 코드를 보니 굳이 시작, 편의점, 페스티벌 좌표를 나눌 필요없이 for문을 이용하면 되는데 불필요한 코드 분리가 있었던 게 보인다.import java.io.*;import java.util.*;public class Main { public static void main(String[] args) throws IOE..

[프로그래머스] #87694 아이템 줍기

https://school.programmers.co.kr/learn/courses/30/lessons/87694 프로그래머스SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 생각해야 하는 점흔히 마주하는 BFS/DFS 문제(맵, 미로찾기 등)와 비슷해 보이지만 해당 문제는 각 칸에 대해 0/1(벽인지 길인지)로 주어져있지는 않다. 그래서 처음에는 어떻게 해야하는지 고민했는데, 그럼 내가 직접 0/1 구조(이동할 수 있는 길은 1, 안되는 길은 0)로 map을 만들어주면 되겠다고 생각했다.근데 그렇게 하면 문제가 발생하는데, 좌표가 붙어있는데 길은 없을 경우 1과 1이 인접하여 길이 있다고 판단할 수 있다.따라서 이러한 문제..

[백준] #1783 병든 나이트, 그리디

https://www.acmicpc.net/problem/1783 나이트가 이동할 수 있는 규칙은 아래 4가지이다. 1. 2칸 위, 1칸 오른쪽2. 1칸 위, 2칸 오른쪽3. 1칸 아래, 2칸 오른쪽4. 2칸 아래, 1칸 오른쪽 처음에는 응? 그냥 이동하면 모든 칸을 방문할 수 있는거 아닌가?라고 생각했는데, 움직일 수 있는 규칙을 잘 보면 모두 "오른쪽"으로 움직일 수 있다. 문제를 조금 파악해보고자 아래와 같이 그림을 그려봤다. 1. 세로(N)가 1일 때- 위아래로 움직일 수 없으니 1칸만 방문할 수 있다. 2. 세로(N)가 2일 때- 1칸 위아래로만 이동할 수 있으므로 규칙 2, 3번만 이용이 가능하다.- 이때 2, 3번은 가로로 2칸씩 가야하므로, 방문 칸수는 (M + 1) / 2인데 최대 ..

[백준] #11497 통나무 건너뛰기, 그리디

https://www.acmicpc.net/problem/11497 문제 요약통나무들을 원형으로 배치했을 때, 인접한 통나무의 높이 차이의 최댓값을 최소화해야 한다.즉,max(|a[i] - a[i+1]|) 의 최솟값을 구해야 한다. (원형이므로 첫번째와 마지막도 인접) 아이디어우리는 차이가 작아지게 해야하는데, 차이가 커지는 경우는 큰값과 작은값이 함께 붙어있을 때이다.따라서 우리는 큰 값과 작은 값이 붙지 않게 배치해야 한다. 이럴 경우, a0 a1 a2 a3 ... aN-1 이렇게 오름차순이라고 하면아래와 같이 배치할 수 있다.a0 a2 a4 ... a5 a3 a1 풀이1. 우선 문제에서는 정렬되지 않은 통나무의 높이가 주어지므로 정렬을 해준다.2. Deque을 이용해 'a0 a2 a4 ... a5..