🧩 Dual-Pivot Quicksort
·
Java/알고리즘
핵심 개념Quicksort는 pivot 1개를 사용해 배열을 두 부분으로 나누지만, Dual-Pivot Quicksort는 pivot 2개를 사용해 배열을 세 부분으로 나눕니다.각 구간을 재귀적으로 정렬하는 고성능 분할 정복 기반 정렬 알고리즘입니다.Arrays.sort()에 사용되고 있습니다.분할 방식(Pivot 2개 → 3 구간)pivot1 배열을 다음 3개의 부분으로 나눔:arr[i] pivot1 ≤ arr[i] ≤ pivot2arr[i] > pivot2이 3개 구간을 각각 재귀적으로 정렬동작 절차 구현아래 소스는 이해를 위해 만든 로직입니다. Arrays.sort()와는 접근 방식이 다릅니다.결과값은 같습니다.void dualPivotSort(int[] arr, int left, int right..
Binary Gap 문제
·
Java/코딩테스트
문제숫자를 이진수로 변환하여 1과 1사이의 길이 수를 출력아이디어1. 숫자를 바이너리 문자로 변환 후 순회하면서 0 카운트 갱신구현이 가장 직관적디버깅, 테스트 쉬움문자열 변환·할당 비용이 있음O(logN)2. 비트 연산 단일 루프 방식순회 N > 0N & 1 으로 LSB 조사N >>= 1 로 한 비트씩 오른쪽으로 이동문자열 변환 없이 비트만 직접 다름, O(1), 속도 측면에서 매우 효율적비트 마스크·시프트에 익숙해야함3. 정규 표현식 활용2진 문자열에서 1 ( 0+ ) 1 패턴을 모두 찾아서 그룹 길이의 최댓값코드가 한두 줄로 간결정규식 매칭 비용이 있고, 가독성이 다소 떨어질 수 있음4. 수학적 모듈로 연산N % 2 로 LSB를 구하고N /= 2 로 우측 쉬프트와 동일한 효과를 내면서0,1 카운팅 ..
CAS(Compare-And-Swap) 기법
·
Java
1. 개요CAS(Compare-And-Swap)는 동시성 프로그래밍에서 사용되는 원자적 연산 기법이며, CPU 명령 수준에서 제공되는 저수준 동기화 메커니즘참고!자바 진영에서 다중 스레드 환경에서 동기화 문제를 해결하기 위한 기법으로, 자바의 Atomic 클래스에서 자주 사용됩니다. CAS는 락을 사용하지 않고도 변수의 일관성을 유지할 수 있도록 하며, 특히 경합이 적은 상황에서 유용하게 사용됩니다.이 기법은 잠금을 사용하지 않고도 여러 스레드가 동시에 변수를 수정할 수 있도록 도와줍니다.기본 개념• CAS 연산은 메모리의 특정 위치에서 현재 값을 읽어와, 기대한 값(expected value)과 비교합니다.• 만약 현재 값이 기대한 값과 동일하면, 새 값(new value)으로 변경합니다.• 그렇지 않..
벽 부수고 이동하기
·
Java/코딩테스트
1. 문제N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 당신은 (1, 1)에서 (N, M)의 위치까지 이동하려 하는데, 이때 최단 경로로 이동하려 한다. 최단경로는 맵에서 가장 적은 개수의 칸을 지나는 경로를 말하는데, 이때 시작하는 칸과 끝나는 칸도 포함해서 센다.만약에 이동하는 도중에 한 개의 벽을 부수고 이동하는 것이 좀 더 경로가 짧아진다면, 벽을 한 개 까지 부수고 이동하여도 된다.한 칸에서 이동할 수 있는 칸은 상하좌우로 인접한 칸이다.맵이 주어졌을 때, 최단 경로를 구해 내는 프로그램을 작성하시오.입력첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)이 주어진다.다음 N개의 줄에 M개의 ..
동적계획법(DP, Dynamic Programming)
·
Java/알고리즘
1. 왜 만들어 졌을까?어원(When)Dynamic: 시간에 따라 변하는 걸 의미하는 것이 아님!Programming: 코드 작성이 아니라, 계획(Plan)을 짠다는 의미즉, 유동적으로 결정하는 계획 정도의 뜻누가 만들었나?Richard Bellman(리처드 벨만), 1950년대미 국방성 프로젝트 중 최적화 문제를 해결하기 위해 개발 왜? ‘Dynamic Programming’이라 이름 붙였나?벨만의 유명한 일화에 따르면:내가 일하던 국방 프로젝트는 ‘수학’이나 ‘과학’이라는 단어에 거부감을 가진 관리들이 있었지그래서 그들이 이해 못할 단어를 골라야 했어. 그래서 ‘다이내믹 프로그래밍’이라고 불렀지즉, 본래 의미보다 정치적 이유(!)로 지어진 네이밍…어떤 알고리즘이야?큰 문제를 작은 문제를 나눠서 푼 ..
자료구조 선택 (HashSet vs BitSet)
·
Java/성능최적화
메모리 사용량1. 비트셋(BitSet)의 메모리 사용고정 비용: 비트셋은 내부적으로 long[] 배열로 비트를 저장합니다.예를 들어 new BitSet(1_000_000)은 약 1,000,000 비트(≈125 KB) + 배열 오버헤드(약 몇십 바이트) 정도를 사용합니다.저장 가능한 값의 최대치(=capacity)에 관계없이, capacity/8 바이트를 항상 차지합니다.장점:대량의 연속된 정수 범위에서 “존재 여부”만 저장할 때 가장 압축적입니다.단점:실제로 저장된 요소가 적더라도, 범위 전체에 대해 메모리를 할당합니다. 2. 해시셋(HashSet)의 메모리 사용가변 비용: HashSet은 내부적으로 HashMap을 쓰고, 키마다 Node 객체(엔트리)와 버킷 배열(참조 배열)을 유지합니다.버킷 배열:..
수 찾기
·
Java/코딩테스트
문제N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오. 입력첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -2^31 보다 크거나 같고 2^31보다 작다.N 개의 정수 배열M 개의 정수 배열M 배열의 정수가 N 배열에 있는지 판단하여 1,0 출력정수 범위 -2^31 출력출력M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다. 해결방법1. 절차적publ..
싱글톤 패턴
·
Java/디자인 패턴
✅ 싱글톤(Singleton) 패턴이란?어떤 객체는 시스템 전역에서 오직 하나만 존재해야 할 때가 있습니다. 예를 들어:설정 정보 관리 객체데이터베이스 커넥션 풀로깅 시스템이러한 요구는 객체의 생명주기를 명확히 통제하고, 동일한 자원 접근을 일관성 있게 유지해야 하는 필요에서 출발합니다. 이를 실현하는 대표적인 디자인 패턴이 싱글톤 패턴입니다.✅ 싱글톤의 정의오직 하나의 인스턴스만 생성전역(Global)하게 접근 가능객체 생성과 접근 과정 모두에서 스레드 안전(Thread-safe) 확보가 중요✅ 싱글톤 구현 방식 비교방식특징장점단점Lazy Initialization (기본)필요 시 생성메모리 절약멀티 스레드 환경에서 다중 생성 위험Synchronized Method메서드에 synchronized스레드 ..
JCE 암호화 트러블 슈팅
·
IT 지식
📌 개요JDK 버전 변경으로 인한 Cipher 암/복호화 길이 오류가 발생한 트러블슈팅에 관한 사례로여러 방안을 토대로 협의하여 문제를 해결한 구조를 정리한 글이다.🔍 문제 상황고객사 JDK 버전이 6 ➔ 8로 업그레이드됨.자사 암호화 모듈은 JDK6 기반(아마 128bit 이하 키 길이를 전제로 설계)으로 작성됨.JDK8u161 이후 버전부터는 기본적으로 고급 키 길이(예: 256bit) 를 쓰려면 제약이 걸려 있어서,실행 시 에러 발생:javax.crypto.IllegalBlockSizeException: Illegal key size or default parameters 🧐 원인 분석JCE 기본 정책(Policy) 때문이다.기본적으로 Oracle JDK는 미국 수출 규제 때문에 강한 암호화(..
스프링부트 파일 업로드 다운로드
·
학습/스프링부트
1. (전송) HTML 폼 전송 2가지 방식의 이해application/x-www-form-urlencodedmultipart/form-dataform 태그로 전송시 기본적으로 문자만 전송하는 application/x-www-form-urlencoded 로 전송POST /save HTTP/1.1Host: localhost:8080Content-Type: application/x-www-form-urlencodedusername=kim&age=20파일을 업로드 하려면 파일은 문자가 아니라 바이너리 데이터를 전송해야한다.application/x-www-form-urlencoded 은 문자를 전송하는 방식이기 때문에 파일로 전송하기 어렵다.실제로 보통 폼을 전송할 때는 달랑 파일만 전송하는 것이 아니라 문자값..