분류 전체보기 195

[USACO Gold] Dynamic Programming, 동적 계획법, DP 소개

사실 '다이나믹'도 아니고, '프로그래밍'도 아닌 다이나믹 프로그래밍은 알고리즘 문제의 단골 요소이자 매우 효율적인 컴퓨터공학의 계산 효율화 방법이다.DP는 벨만-포드 알고리즘과 벨만 방정식, 강화학습의 토대를 마련한 미국의 응용수학자 리처드 E. 벨만이 발견했다. 이는 리액트의 렌더링 및 BFS, 캐싱, 비즈니스 로직 및 게임 엔진 최적화부터 심지어는 RL에까지 등장하고 있다. 이 DP에 대해, 지금부터 차근차근 알아보자.DP의 성질은 딱 두가지로 정리가 가능하다최적 부분구조중복 부분문제최적 부분구조최적 부분구조(Optimal Substructure)은 "경로에 관계없이" 다음 문제의 해답이 이전 부분문제의 최적화로 구해지는 구조를 의미한다.이를 다르게 표현하면, 뒷 문제의 정답을 구하는 과정이 앞 문..

PS/USACO Gold 2025.09.09

[USACO Gold] 모듈러 연산, 모듈러 역원, 정수론에서의 합동

모듈러 연산에서는 정수 그 자체로 계산하지 않고, 어떤 수를 m으로 나눈 나머지로 계산한다.이를 "모듈러 m을 취한다”라고 부른다. 예를 들어 m=23이라면, x=247 대신 x  mod  23=17을 사용한다.보통 m은 문제에서 주어지는 큰 소수(prime)이며, 가장 흔한 값은1000000007998 244 353=119⋅2^23+1이다.모듈러 산술은 내장 자료형의 범위를 넘는(오버플로) 큰 수를 다루지 않기 위해 사용되며, 다음 공식을 이용해 나머지를 취할 수 있다.Modular Exponentiation (모듈러 거듭제곱)거듭제곱 (Easy)https://cses.fi/problemset/task/1095 CSES - ExponentiationCSES - Exponentiation Time lim..

PS/USACO Gold 2025.09.08

[RabbitMQ Java] RabbitMQ를 이용한 RPC

두 번째 튜토리얼에서 우리는 Work Queue를 사용하여 시간이 오래 걸리는 작업을 여러 워커(worker)에게 분산하는 방법을 배웠다. 하지만 어떤 함수를 원격 컴퓨터에서 실행하고 그 결과를 기다려야 한다면 어떨까?이는 조금 다른 이야기가 된다.이 패턴은 흔히 원격 프로시저 호출(Remote Procedure Call, RPC) 이라고 불린다. 이번 튜토리얼에서는 RabbitMQ를 사용하여 RPC 시스템(클라이언트와 확장 가능한 RPC 서버) 을 만들어보자.분산할 만한 시간이 오래 걸리는 작업은 딱히 없으므로, 임의로 피보나치 수를 반환하는 단순한 RPC 서비스를 예제로 구현할 것이다.클라이언트 인터페이스RPC 서비스 사용 방식을 보여주기 위해 간단한 클라이언트 클래스를 만든다.call이라는 메서드..

[RabbitMQ Java] Pub-Sub 3: 토픽

이전 튜토리얼에서는 로깅 시스템을 개선했다.단순히 브로드캐스팅만 가능한 fanout exchange 대신 direct exchange를 사용하여 선택적으로 로그를 받을 수 있도록 했었다. direct exchange를 사용함으로써 시스템이 개선되었지만, 여전히 한계가 존재한다.바로 여러 기준을 기반으로 라우팅할 수는 없다는 점이다.우리의 로깅 시스템에서는 심각도(severity)뿐 아니라 로그를 발생시킨 소스(source)에 따라서도 구독하고 싶을 수 있다.이 개념은 Unix의 syslog 도구에서 익숙할 수 있다.syslog는 심각도(info/warn/crit...)와 facility(auth/cron/kern...) 모두를 기준으로 로그를 라우팅한다. 이를 지원하는 기법이 바로 토픽(Topic)이다..

[RabbitMQ Java] Pub-Sub 2: 메시지의 라우팅, Direct Binding

이전 튜토리얼 에서는 간단한 로깅 시스템을 구축했다. [RabbitMQ Java] Pub-Sub 모델, 그리고 Exchange이전 튜토리얼 에서는 Work Queue를 생성했다. [RabbitMQ Java] Work Queue 직접 만들어보기와 메시지의 분배 방식이번 튜토리얼에서는 시간이 많이 걸리는 작업을 여러 작업자 간에 분배하는 데 사용할 Wodev.go-gradually.me이를 통해 로그 메시지를 여러 수신자에게 브로드캐스트할 수 있었다. 이 튜토리얼에서는 여기에 기능을 추가해볼 것이다.바로 메시지의 일부만 구독할 수 있도록 하는 것이다.예를 들어, 디스크 공간을 절약하기 위해 중요한 오류 메시지만 로그 파일에 저장하면서도 모든 로그 메시지를 콘솔에 출력할 수 있다.바인딩이전 예제에서는 이미 바..

[RabbitMQ Java] Pub-Sub 1: Pub-Sub 모델, 그리고 Exchange

이전 튜토리얼 에서는 Work Queue를 생성했다. [RabbitMQ Java] Work Queue 직접 만들어보기와 메시지의 분배 방식이번 튜토리얼에서는 시간이 많이 걸리는 작업을 여러 작업자 간에 분배하는 데 사용할 Work Queue(작업 큐)를 만들어 보자. Work Queue(Task Queue)의 핵심 아이디어는 리소스 소모가 많은 작업을 즉시dev.go-gradually.meWork Queue의 기본 가정은 각 작업이 정확히 하나의 워커에게 전달된다는 것이다.이번 파트에서는 ​​완전히 다른 작업을 수행할 것이다.바로, 하나의 메시지가 이를 구독한 여러 컨슈머에게 메시지를 전달하는 형태이다.이 패턴을 "Pub/Sub"이라고 한다. 즉, 다음과 같다.- 생산자/소비자 모델은 하나의 메시지가 하..

[RabbitMQ Java] Work Queue 직접 만들어보기와 메시지의 분배 방식

이번 튜토리얼에서는 시간이 많이 걸리는 작업을 여러 작업자 간에 분배하는 데 사용할 Work Queue(작업 큐)를 만들어 보자. Work Queue(Task Queue)의 핵심 아이디어는 리소스 소모가 많은 작업을 즉시 실행하고 완료될 때까지 기다리는 것을 방지하는 것이다.먼저, 우리는 이어질 작업이 나중에 수행되도록 작업을 예약시킨다.또한 우리는 그 작업을 메시지로 캡슐화하여 큐에 보낼 것이다.백그라운드에서 실행되는 worker 프로세스가 각자 작업을 팝(pop)하고 최종적으로 작업을 실행한다.여러 worker를 실행하면 작업이 작업자 간에 공유되도록 만든다.이 개념은 짧은 HTTP 요청 창 동안 복잡한 작업을 처리하는 것이 불가능한 웹 애플리케이션에서 특히 유용하다.준비 작업이 튜토리얼의 이전 부..

[RabbitMQ Java] 가장 간단한 프로듀서-컨슈머 사용해보기

원래 RabbitMQ 는 할 생각이 없었고, Kafka를 해보려고 했는데Kafka Definitive Guide의 내용이 너무 방대해서 당장 애플리케이션을 만들기 위한 기술에는 부적합하다고 판단했다.따라서, RabbitMQ를 공부해보고자 한다.RabbitMQ는 메시지를 수신하고 전달하는 메시지 브로커이다. 간단하게 우체국에 비유해 보자.우편물을 우체통에 넣으면 우편 배달부가 결국 수신자에게 우편물을 배달할 것이라고 확신할 수 있다.이 비유에서 RabbitMQ는 우체통, 우체국, 그리고 우편 배달부이다. RabbitMQ와 우체국의 주요 차이점은 RabbitMQ는 종이를 다루지 않고 대신 이진 데이터 블롭(메시지)을 수용, 저장, 전달한다는 점이다.RabbitMQ와 메시징 전반에서는 몇 가지 전문 용어를..

[USACO Gold] Divisibility - PS(알고리즘)에서의 나눗셈

이와 같은 수학 문제는 코딩 테스트에는 잘 출제되지 않기 때문에 건너뛰는 사람들도 많지만,나는 시간복잡도 계산에 가장 강력한 인사이트를 부는 내용이 바로 이 수학 부분이라고 생각한다.그래서 이 수학 파트도 건너뛰지 않고 어느정도 설명을 진행하도록 하겠다.소인수분해 (Prime Factorization)양의 정수 a가 음이 아닌 정수 b의 약수(divisor) 또는 인수(factor)라고 불리는 것은, b가 a로 나누어떨어진다는 의미이다. 즉, 어떤 정수 k가 존재하여 b = ka가 되는 경우이다.정수 n > 1이 소수(prime)라는 것은 그 약수가 1과 n뿐일 때를 말한다.1보다 큰 정수 중 소수가 아닌 수는 합성수(composite)라고 한다. 모든 양의 정수는 유일한 소인수분해를 가진다. 즉, 소수..

PS/USACO Gold 2025.09.07

[USACO Silver] 1차원 누적 합

아래 내용은 미국 정보 올림피아드인 USACO의 알고리즘 문제 학습 가이드인 usaco.guide를 참고하여 작성되었습니다 Introduction to Prefix SumsComputing range sum queries in constant time over a fixed 1D array.usaco.guide 시작 전에 이 문제를 풀어보고 오자.난이도: Very Easy Library Checker judge.yosupo.jp 길이가 N인 다음 값을 계산하기 원하는 1차원 정수 배열이 있다고 가정해보자.우리는 여기서 서로 다른 Q개의 쿼리를 (a,b)으로 보낼 것이다.그때의 (a, b)는아래 식을 만족한다.간단한 예시를 위해, N을 6으로 두고 문제를 풀어보자.인덱스 i123456arr[i]164253..

PS/USACO Silver 2025.09.06