CS 정리 20

ConcurrentHashMap 알고쓰자

Thread-safe 하고, 성능도 고려된 HashMap1) 키-값 삽입, 조회, 삭제 2) 조건부 연산 (putIfAbsent, computeIfAbsent, merge)3) 병렬 루프 처리 (forEach, reduce) * Thread-safe: 멀티스레드 환경에서 코드나 객체가 동시에 접근돼도 문제가 발생하지 않도록 설계된 상태 ? 왜 ConcurrentHashMap 은 Thread-safe 할까 ?내부 구조 및 동시성 제어 기법1. CAS (Compare-And-Swap) + Synchronized 최소화 (Java 8 이후)Java 8부터는 Segment 대신 버킷 단위 락 + CAS 연산을 도입해 더 세밀한 락 제어가 가능해졌습니다.CAS 연산: 특정 조건이 만족될 때만 값을 변경하는 락 ..

CS 정리 2025.06.11

기사의 현명한 아내: 불가능한 여정 찾기(java 코드포함 풀이)

문제 정보 데블스플랜2 기사의 여정, 근데 코딩테스트 곁들인..넷플릭스에서 데블스플랜2를 보다가 내용에 집중 못하고 잡념만 떠오른 게임이 있다바로 기사의 여정(여행) 기사의 여행 - 위키백과, 우리 모두의 백과사전위키백과, 우리 모두의 백과사전. 체moonquery.tistory.com 문제 풀이저는 이런 종류의 문제를 한번에 못짜기 때문에 분할정복(?) 하는 편 입니다.그래야 잘못된 길로가도 코드 몇 라인 정도는 살려서 써먹을 수 있더라고요 1. 기사의 이동 구현하기8 방향 이동을 배열로 정의이동 가능한 위치인지 확인(이전에 갔던 곳이거나 맵의 밖이면 못가도록 처리)int[] dx = {2, 1, -1, -2, -2, -1, 1, 2};int[] dy = {1, 2, 2, 1, -1, -2, -2, -..

데블스플랜2 기사의 여정, 근데 코딩테스트 곁들인..

넷플릭스에서 데블스플랜2를 보다가 내용에 집중 못하고 잡념만 떠오른 게임이 있다바로 기사의 여정(여행) 기사의 여행 - 위키백과, 우리 모두의 백과사전위키백과, 우리 모두의 백과사전. 체스판 위에서의 경로의 예 5x5 기사의 여행을 나타낸 애니메이션 기사의 여행은 체스보드의 나이트에 대한 수학적인 알고리즘 문제의 일종이다. 체스 피스를ko.wikipedia.org 이거 코테 문제로 있을 것 같은데? DP를.. 아니 백트래킹을..LeetCode에서 제공하는 문제가 있다! (프로그래머스 점수 올리고 싶다)다만 경로의 유효성 검증이라서 게임을 진행하는 느낌이 안든다다른 사이트에서도 유사한 문제를 제공하기는 하나, 실행 검증하는 기능이 없거나, 풀이를 줘버려서 화들짝 꺼버렸다 LeetCode https://..

Java 키워드 모음: static, final, synchronized, abstract, transient

1. static개념클래스 단위 변수나 메서드를 의미합니다. 객체 생성 없이도 클래스 이름으로 바로 접근할 수 있으며, JVM의 클래스 영역에 저장되어 모든 인스턴스가 공유합니다.샘플 코드public class Counter { public static int count = 0; public static void increment() { count++; }}Counter.increment();System.out.println(Counter.count); // 출력: 1활용 방안공통으로 사용해야 하는 값이나 메서드를 관리할 때 유용합니다. 예를 들어, 전체 객체 수 카운트, 유틸리티 메서드 등에 많이 사용합니다. 2. final 개념값 변경이 불가능한 상수를 선언하거나, 메서..

CS 정리 2025.05.28

JAVA DP(동적 계획법)

DP는 큰 문제를 작은 문제로 나누고, 그 작은 문제의 해답을 재사용하여 전체 문제를 푸는 방식 비효율적인 중복 계산을 줄일때 효율적임비슷한 계산을 반복할 것 같을 때 의심하고 적용해보는 전략 1. 경로 수 "몇 가지 방법?"ex) 타일링, 계단 오르기2. 최댓값/최솟값 "최대 이득/점수?"ex) 배낭, 땅따먹기3. 조합 최적화 "어떻게 조합해야 최선?"ex) 숫자 변환, 동전 교환4. 부분 문제 반복 "부분 계산 중복"ex) 피보나치, 문자열 비교 점화식 dp[n]=dp[n−1]+dp[n−2] 문제 풀이땅따먹기https://school.programmers.co.kr/learn/courses/30/lessons/12913문제 키포인트1) 브루트포스, 그리드 사용하지말자2) 테스트 케이스 생각해보고 가..

JAVA 문자열 처리

자주 나오는 유형회문 검사 (Palindrome)아나그램 비교중복 문자 제거문자열 압축, 슬라이딩 윈도우문자 빈도 수 세기Java 핵심 포인트StringBuilder, String.charAt(i), toCharArray()Map, Set, Arrays.sort()substring, split, replace, equals, charAt문제 풀이문자열 압축https://school.programmers.co.kr/learn/courses/30/lessons/60057 문제 키포인트1) 압축 가능한 자릿수까지 모두 압축해보고 길이 비교하기 (s.length /2 까지 압축 가능)2) 압축된 문자열 StringBuilder 에 담기3) 시작지점부터 압축이 가능한 조건이어야 하며, 압축이 불가능한 뒷부분은 그..

Java 대용량 데이터 처리 (6) - 멀티 쓰래드/병렬 처리

6. 싱글 쓰레드 → 멀티 쓰레드 / 병렬 처리 (10만 명에게 알림 발송)싱글 쓰레드 vs 멀티 쓰레드/병렬 처리싱글 쓰레드 방식은 하나의 작업 흐름으로 모든 알림을 순차적으로 처리.사용자는 많고, 각 알림 발송 시간이 지연되면 전체 처리 시간도 길어짐.멀티 쓰레드 / 병렬 처리는 여러 쓰레드를 활용해 동시에 알림을 전송.작업을 분산해 처리 속도를 높이고, 전체 처리 시간을 획기적으로 단축할 수 있음. 비동기 병렬 처리 예제 Bad case: 싱글 쓰레드public class NotificationService { public void sendNotifications(List users) { for (String user : users) { send(user); ..

CS 정리 2025.05.04

Java 대용량 데이터 처리 (5) - 캐시 계층 활용(L1, L2, DB)

5. DB만 사용 → DB + 캐시 + 계층 구조 활용 (상품 상세정보 조회)DB 단독 조회 vs 캐시 계층 활용DB 단독 조회는 사용자의 요청이 있을 때마다 매번 DB에 접근해서 데이터를 가져오는 방식.트래픽이 많거나 요청이 반복되는 경우, DB 부하 증가와 응답 지연이 발생할 수 있음.캐시 + 계층 구조 활용은 데이터 조회 시 우선적으로 메모리 캐시(L1),분산 캐시(L2) 등을 확인한 뒤, 없을 경우에만 DB 조회.조회 성능을 극적으로 향상시키고, DB 부하를 줄이는 효과가 있음. 캐시 계층 예시L1 Cache (로컬 메모리): 서버 JVM 내 ConcurrentHashMap 등L2 Cache (분산 캐시): Redis, Memcached 등DB: 최종 백엔드 데이터 소스계층 처리 흐름사용자 요청 ..

CS 정리 2025.05.02

Java 대용량 데이터 처리 (4) - 비동기 데이터 수집

4. 즉시저장 → 모아서 저장 (비동기 데이터 수집)즉시 저장 vs 모아서 저장 (비동기 처리)즉시 저장은 데이터가 들어올 때마다 매번 DB에 저장하는 방식.하지만 대량의 트래픽이 발생하면 DB 부하가 급격히 증가하고, 성능 저하 발생 가능.모아서 저장 (비동기 처리)는 데이터를 메모리 큐 등에 임시로 저장하고,일정 수 이상이 모이거나 일정 시간이 지나면 한꺼번에 DB에 저장.이를 통해 시스템 부하를 줄이고, 응답 속도를 빠르게 유지할 수 있음.비동기 처리 예제Bad case: 동기 처리public class SynchronousSave { public void saveData(Data data) { // 요청이 들어오자마자 즉시 DB 저장 saveToDatabase(dat..

CS 정리 2025.04.29

Java 대용량 데이터 처리 (3) - 비동기 처리

3. 즉시응답 -> 비동기 예약 (10만 건 엑셀 다운로드)즉시 응답 vs 비동기 예약 처리즉시 응답은 사용자가 요청을 보낸 후 즉시 결과를 반환하는 방식. 그래서 대용량 데이터 처리 시 서버에 큰 부담을 주고, 응답 속도가 지연.비동기 예약은 사용자가 요청을 보내면 즉시 예약을 하고, 실제 데이터 처리 작업은백그라운드에서 비동기적으로 처리. 이 방식은 서버 과부하를 방지하고, 사용자가 요청 상태를 기다리지 않아도 됨. (추후 알림 등 기능과 연계하여 요청완료)비동기 처리 예제Bad case: 동기 처리public class SynchronousProcessing { public void processData() { // 대용량 데이터 처리 processLargeData()..

CS 정리 2025.04.27