[백준] BOJ 1874 스택 수열
·
Java/코딩테스트
링크: https://www.acmicpc.net/problem/1874문제스택 (stack)은 기본적인 자료구조 중 하나로, 컴퓨터 프로그램을 작성할 때 자주 이용되는 개념이다. 스택은 자료를 넣는 (push) 입구와 자료를 뽑는 (pop) 입구가 같아 제일 나중에 들어간 자료가 제일 먼저 나오는 (LIFO, Last in First out) 특성을 가지고 있다.1부터 n까지의 수를 스택에 넣었다가 뽑아 늘어놓음으로써, 하나의 수열을 만들 수 있다. 이때, 스택에 push하는 순서는 반드시 오름차순을 지키도록 한다고 하자. 임의의 수열이 주어졌을 때 스택을 이용해 그 수열을 만들 수 있는지 없는지, 있다면 어떤 순서로 push와 pop 연산을 수행해야 하는지를 알아낼 수 있다. 이를 계산하는 프로그램을..
[백준] 숫자 카드 2
·
Java/코딩테스트
문제링크: https://www.acmicpc.net/problem/10816문제숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 몇 개 가지고 있는지 구하는 프로그램을 작성하시오.입력첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 몇 개 가지고 있는 숫자 카드인지 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분..
[MyBatis] Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value
·
Java/스프링부트
Caused by: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for {패키지.클래스.메서드.} 원인: MyBatis 기능으로 동일한 메서드에 쿼리가 중복 정의 되었다는 것해결방법mapper XML 파일과 @Mapper 애너테이션이 지정된 인터페이스를 확인해보고 동일한 패키지, 메서드를 비교해서 중복 지정하고 있는지 확인해보면 해결 가능하다.
[스프링부트] @ControllerAdvice
·
Java/스프링부트
@ControllerAdvice는 모든 컨트롤러에 대해 전역 기능을 제공하는 애너테이션입니다. @ControllerAdvice가 선언된 클래스에 @ExceptionHandler, @InitBinder, @ModelAttribute를 등록하면 예외 처리, 바인딩 등을 한 곳에서 처리할 수 있어, 코드의 중복을 줄이고 유지보수성을 높일 수 있습니다. @ControllerAdvice는 내부에 @Component가 포함되어 있어 컴포넌트 스캔 과정에서 빈으로 등록됩니다. @RestControllerAdvice는 내부에 @ResponseBody를 포함하여 @ExceptionHandler와 함께 사용될 때 예외 응답을 Json 형태로 내려준다는 특징이 있습니다.1. @ControllerAdivce 구조 및 역할역할..
[알고리즘 원리] 문자열 → 정수 변환 (n = n * 10 + d) 공식의 원리와 증명
·
Java/알고리즘
컴퓨터 프로그래밍에서 숫자를 입력받는 것은 흔히 있는 일이지만, 그 내부의 원리를 정확히 이해하고 있는 사람은 많지 않습니다. 이번 글에서는 숫자 입력을 처리할 때 흔히 사용하는 공식인 n = n * 10 + (c - '0')의 원리와 수학적 의미를 상세히 다뤄보겠습니다.✅ 왜 이 주제를 다루는가?처음 이 공식을 접하면 직관적으로 이해하기 어렵습니다.저 또한 처음에는 “왜 갑자기 *10을 곱하지?“라는 의문을 가졌습니다.이 글은 저와 같은 고민을 한 분들에게 직관적인 이해와 명확한 설명을 제공하기 위해 작성되었습니다.✅ 기본 공식 (n = n * 10 + (c - '0')) 설명하기이 공식은 문자열로 입력받은 숫자를 정수형으로 변환할 때 사용되는 표준 알고리즘입니다.예시로 숫자 “371”을 살펴봅시다.읽..
N+1에서 시작된 쿼리 전략의 이해
·
Java/스프링부트
🧭 "왜 N+1이 발생하나요?"라는 질문에서 시작된 모든 것어느 날, 단순히 데이터를 조회하는 코드에서 쿼리가 너무 많이 날아가는 걸 목격했다. member.getTeam().getName() 같은 코드를 루프에서 호출했을 뿐인데, 로그에는 수십 개의 select 쿼리가 찍혔다.아… N+1 문제였다.✅ 한 번의 메인 쿼리로 데이터를 조회했지만, 연관된 데이터를 N번 추가로 조회 → 총 1 + N번의 쿼리 발생💡 여기서 첫 의문Lazy 로딩이면 필요한 시점에만 로딩되는 거 아닌가? 그런데 왜 이렇게 많은 쿼리가 발생하지?이 질문은 나를 JPA 내부의 fetch 전략, 연관관계 매핑, 그리고 성능 최적화 방법으로 이끄는 시작점이 됐다.🔍 연관관계와 Fetch 전략 이해JPA에서 연관 관계는 보통 @Ma..
Thread와 대안들
·
Java
Java의 Tread 클래스는 동시성 프로그래밍의 기초이자, 과거부터 지금가지 진화해 온 병렬처리의 기반 도구입니다.스레드와 동기화는 고성능 애플리케이션 개발에 필수적인 요소입니다.멀티스레드 환경에서 자원을 안전하게 공유하고 효율적으로 관리하기 위해 동기화는 필수적입니다.1. Thread 클래스란?java.lang.ThreadJava에서 독립 실행 흐름(스레드)를 만들기 위한 핵심 클래스JVM 내부의 스레드 스케줄러에 의해 관리되며, OS의 실제 스레드에 매핑됩니다.2. 주요 필드 및 핵심 기능기능설명start()새로운 스레드를 시작하여 run() 실행run()스레드에서 실행할 로직 정의 (Runnable 인터페이스 기반)join()해당 스레드가 끝날 때까지 대기sleep(ms)스레드를 일정 시간 정지시..
[IntelliJ] Task 'wrapper' not found in project ':~'. 문제 해결
·
Tools
이런한 케이스는 멀티 모듈을 사용할 때 잘 못 사용하게 되면 발생되는 오류이다.문제상황IntelliJ에서 Gradle 기반 멀티모듈 프로젝트를 Import할 때,하위 모듈이 별도 Gradle 프로젝트처럼 인식되면 다음과 같은 문제가 발생한다:./gradlew wrapper 등 명령어가 하위 모듈에서 실행되지 않음 ✅ Gradle Wrapper란?gradlew, gradlew.bat, gradle/wrapper/gradle-wrapper.jar 등이 포함된 실행 환경프로젝트 내에서 고정된 Gradle 버전으로 빌드 가능✅ Gradle 멀티모듈 구성 방식루트 settings.gradle 또는 settings.gradle.kts에서 명시적으로 모듈을 등록해야 함include 'app', 'common', 'p..
🧩 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 카운팅 ..