본문 바로가기

전체 글

큐 2개로 스택 구현하기 with Kotlin '2개의 큐로 스택을 어떻게 구현할 수 있을까?'에 대한 내용입니다. 큐(Queue)와 스택(Stack)은 프로그래밍에서 자주 사용되는 자료 구조로, 각각 First-In-First-Out(FIFO)과 Last-In-First-Out(LIFO)의 특성을 가지고 있습니다. 이 두 자료 구조의 동작 방식이 다르기 때문에, 하나를 이용해 다른 하나를 구현하는 것은 꽤 재미있는 문제로 다가옵니다. 기본 원리 스택을 구현하기 위해 큐 2개를 사용하는 기본 원리는 다음과 같습니다: 원소를 스택에 '푸시'하기 위해서는, 큐 A를 이용합니다. 원소를 스택에서 '팝'하거나 '피크'하기 위해서는, 큐 B를 이용하여 큐 A의 원소를 하나 빼고, 나머지 원소들을 큐 B로 이동시킨 뒤, A와 B의 역할을 바꾸어 팝/피크 연산을.. 더보기
두 개의 스택을 사용하여 큐 구현하기 스택과 큐의 기본 개념 스택 (Stack) 스택은 데이터를 후입선출(LIFO: Last-In-First-Out) 방식으로 저장하는 자료 구조입니다. 즉, 가장 나중에 들어간 데이터가 가장 먼저 나오게 됩니다. 큐 (Queue) 반면에 큐는 선입선출(FIFO: First-In-First-Out) 방식으로 데이터를 저장합니다. 처음 들어간 데이터가 가장 먼저 나오게 되죠. 스택 두 개로 큐를 만들기 스택 두 개를 사용하여 큐의 동작을 구현할 수 있습니다. 기본 알고리즘은 다음과 같습니다: Enqueue (데이터 추가): 첫 번째 스택을 사용하여 데이터를 추가합니다. Dequeue (데이터 제거): 만약 두 번째 스택이 비어 있다면, 첫 번째 스택의 모든 요소를 두 번째 스택으로 옮긴 후, 두 번째 스택에서 .. 더보기
중괄호 짝 맞추기 문제 풀이 주어진 문자열에서 중괄호 {와 }가 올바르게 짝을 이루고 있는지 판별하는 함수를 작성하세요. 올바른 짝을 이루고 있다면 true, 그렇지 않다면 false를 반환해야 합니다. 해결 전략 이 문제를 해결하기 위해선 스택이라는 자료구조를 활용합니다. 스택은 LIFO(Last In, First Out)의 특징을 가진 자료구조로, 마지막에 들어간 요소가 가장 먼저 나오게 됩니다. fun isValidBrackets(s: String): Boolean { val stack = mutableListOf() for (ch in s) { when (ch) { '{' -> stack.add(ch) '}' -> { if (stack.isNotEmpty() && stack.last() == '{') { stack.remov.. 더보기
스프링의 RedisLockRegistry를 활용한 제한된 상품의 동시성 제어 및 주문 처리 개요 이 포스팅에서는 스프링의 RedisLockRegistry를 활용하여 제한된 상품의 주문 처리에 대한 동시성 제어를 다루어 보겠습니다. 사용자가 동일한 제한된 상품을 구매할 때, 여러 주문 서비스 인스턴스에서 동시성 제어를 해야 할 필요가 있습니다. 이 때 RedisLockRegistry가 큰 역할을 합니다. 설정 의존성 추가 id 'org.springframework.boot' version '3.1.4' id 'io.spring.dependency-management' version '1.1.3' 먼저, 필요한 의존성을 추가합니다. implementation 'org.springframework.integration:spring-integration-redis' RedisLockRegistry 설.. 더보기
스프링 부트에서 외부 API 서비스를 병렬 처리하여 응답하는 방법 많은 서비스에서 다양한 자산 정보를 사용자에게 제공해야 하는 경우가 있습니다. 예를 들어, 사용자가 보유한 적립금, 쿠폰 개수, 코인 수량 등의 정보를 한번의 요청으로 빠르게 얻고 싶어합니다. 스프링 부트와 자바를 활용하여 이런 자산 정보들을 병렬로 처리하고, 그 결과를 사용자에게 효과적으로 제공하는 방법에 대해 살펴보겠습니다. 스프링 부트에서는 @Async 어노테이션과 CompletableFuture를 활용하여 쉽게 비동기 호출을 구현할 수 있습니다. 이를 통해 여러 API 호출을 동시에 수행하고, 모든 결과를 기다린 뒤 하나로 합치는 병렬 처리를 구현할 수 있습니다. 본 글에서는 적립금, 쿠폰 개수, 코인 수량과 같은 사용자의 다양한 자산 정보를 병렬로 조회 및 처리하여 응답하는 API 서비스 구현에.. 더보기
자바의 Supplier와 Consumer 인터페이스 이해와 활용 자바의 Supplier와 Consumer 인터페이스는 자바 8에서 소개된 함수형 인터페이스로, 각각 데이터를 제공하는 로직과 데이터를 소비하는 로직을 간단하게 표현하는데 사용됩니다. Supplier 인터페이스 Supplier 인터페이스는 파라미터를 받지 않고 값을 리턴하는 get() 메소드를 가지고 있습니다. @FunctionalInterface public interface Supplier { T get(); } Consumer 인터페이스 반면 Consumer 인터페이스는 파라미터를 하나 받아서 소비하고 (처리하고) 리턴 값이 없는 accept() 메소드를 가지고 있습니다 @FunctionalInterface public interface Consumer { void accept(T t); } 예제: .. 더보기
함수형 인터페이스 consumer, supplier, Function Java의 함수형 인터페이스인 Consumer, Supplier, 그리고 Function은 각각 특별한 유형의 작업을 수행하기 위해 사용됩니다. 아래에서 이들 각각에 대해 살펴보고 코틀린에서 어떻게 사용할 수 있는지 알아보겠습니다 1. Consumer Consumer 인터페이스는 입력을 받고 아무런 결과도 반환하지 않는 accept(T t) 메서드를 가집니다. 다시 말해, 이 함수형 인터페이스는 입력을 "소비"합니다. fun consume(consumer: (T) -> Unit, input: T) { consumer(input) } fun main() { val printConsumer: (String) -> Unit = { println(it) } consume(printConsumer, "Hello,.. 더보기
Spring Boot Config Server 1. Spring Boot Config Server 설정 build.gradle.kts plugins { kotlin("jvm") version "1.6.0" id("org.springframework.boot") version "2.6.2" id("io.spring.dependency-management") version "1.0.11.RELEASE" } group = "com.example" version = "0.0.1-SNAPSHOT" java.sourceCompatibility = JavaVersion.VERSION_11 repositories { mavenCentral() } dependencies { implementation("org.springframework.boot:spring-boo.. 더보기