대규모 트래픽 게시판 구축 시리즈 #5: MySQL 데이터베이스 연결 설정
·
프레임워크/자바 스프링
안녕하세요. 이번 글에서는 '대규모 트래픽 게시판' 프로젝트에서 MySQL 데이터베이스 연결과 MyBatis 설정 방법에 대해 알아보겠습니다.1. 개요대규모 트래픽을 처리하는 게시판 시스템에서 데이터베이스 연결과 ORM(Object-Relational Mapping) 설정은 매우 중요합니다. 우리 프로젝트에서는 MySQL을 데이터베이스로, MyBatis를 ORM 프레임워크로 사용하며, 이를 효율적으로 연결하고 관리하기 위해 DatabaseConfig와 MysqlConfig 클래스를 구현했습니다.2. DatabaseConfig 클래스DatabaseConfig 클래스는 데이터베이스 연결을 위한 DataSource를 설정합니다.package com.example.boardserver.config;import ..
대규모 트래픽 게시판 구축 시리즈 #4: 프로젝트 초기 셋업
·
프레임워크/자바 스프링
안녕하세요. 이번 글에서는 '대규모 트래픽 게시판' 프로젝트의 초기 설정과 기술 스택 선택에 대해 상세히 알아보겠습니다.1. 프로젝트 개요'대규모 트래픽 게시판'은 Spring Boot 기반의 확장 가능한 포럼 시스템입니다. 대규모 트래픽을 효과적으로 처리하고, 유연한 확장성을 제공하는 것을 목표로 합니다.2. 주요 기술 스택 및 라이브러리2.1 Spring Boot 3.1.4소개: 자바 기반의 애플리케이션 개발을 위한 프레임워크대안: Quarkus, Micronaut선택 이유: 풍부한 생태계, 광범위한 커뮤니티 지원, 쉬운 설정과 개발 환경2.2 Java 17소개: 여러 실험적 기능과 스프링 부트3.0부터 적용가능한 버전대안: Kotlin, Scala선택 이유: 자바 21버전을 아직 현업에서 많은 기업..
대규모 트래픽 게시판 구축 시리즈 #3: 도커를 이용한 데이터베이스 구축
·
프레임워크/자바 스프링
안녕하세요. 이번 글에서는 MySQL 데이터베이스 환경을 Docker를 이용하여 구축하는 방법에 대해 알아보겠습니다.1. 개요Docker를 사용하여 데이터베이스 환경을 구축하면 다음과 같은 이점이 있습니다:개발 환경의 일관성 유지빠른 설정 및 배포격리된 환경에서의 안전한 테스트버전 관리 용이성우리 프로젝트에서는 MySQL 8.0.31 버전을 사용하며, 초기 스키마 및 데이터 설정을 자동화하여 편리한 개발 환경을 구성할 것입니다.2. 도커 디비 구성을 위한 디렉토리 트리 구조먼저 Docker 관련 파일들의 구조를 살펴보겠습니다:docker/└── db/ ├── Dockerfile ├── compose.yml ├── init_scripts/ │ ├── 001_DDL.sql │ ..
대규모 트래픽 게시판 구축 시리즈 #2: 프로젝트 기획 및 요구 사항
·
프레임워크/자바 스프링
카테고리 API 흐름도설명카테고리컨트롤러는 카테고리의 생성, 수정, 삭제 기능을 담당합니다.카테고리 생성 (POST /categories): 새로운 카테고리를 생성합니다.카테고리 수정 (PATCH /categories/{카테고리ID}): 기존 카테고리의 정보를 수정합니다.카테고리 삭제 (DELETE /categories/{카테고리ID}): 특정 카테고리를 삭제합니다.POST API 흐름도설명게시글컨트롤러는 게시글의 작성, 수정, 삭제 기능을 담당합니다.게시글 작성 (POST /posts): 새로운 게시글을 작성하고, 관련된 태그도 함께 저장합니다.게시글 수정 (PATCH /posts/{게시글ID}): 기존 게시글의 내용을 수정합니다.게시글 삭제 (DELETE /posts/{게시글ID}): 게시글을 삭제하..
대규모 트래픽 게시판 구축 시리즈 #1: 프로젝트 기획 및 요구 사항
·
프레임워크/자바 스프링
안녕하세요, 오늘은 제가 최근에 진행한 "A High-Performance Distributed Forum System for Handling Massive Traffic with Spring" 프로젝트에 대해 소개해드리고자 합니다. 이 프로젝트는 대규모 트래픽을 효과적으로 처리할 수 있는  게시판 시스템을 개발하는 것을 목표로 했습니다.프로젝트 목적대용량 트래픽 처리: 초당 1000 TPS 이상의 게시글 검색 API를 구현하는 등 대규모 동시 접속자를 처리할 수 있는 시스템 구축코드 품질 향상: 객체지향 원칙과 디자인 패턴을 적용하여 가독성과 유지보수성이 높은 코드 작성협업 및 품질 관리: 코드 리뷰 프로세스를 통한 지속적인 개선 및 팀원 간 지식 공유시스템 안정성: 모니터링 도구 구축 및 트러블 슈팅..
[spring cloud][ecommerce] 개요 & 구성
·
프레임워크/자바 스프링
프로젝트 특징사용자는 3가지 마이크로 서비스 사용 가능Docker를 활용한 개발 환경 구축Redis를 활용한 캐싱 전략, 대규모 주문 처리 기술관련 도메인배민, 무신사, 29cm 등의 e-commerce사용 기술 및 개발 환경 *많은 기업에서 실무에 사용되는 라이브러리를 기준으로 설계되어 있습니다.Docker / Docker ComposeSpring BootJava/KotlinJWTHTTP Request / Response프로그래밍 언어: JVM 언어(Java/Kotlin) 버전 17 이상빌드 툴: Gradle프레임워크: SpringBoot 3.XX초기 구성위 이미지는 마이크로서비스 아키텍처(MSA)를 사용하여 구성된 시스템으로, 여러 서비스가 독립적으로 배포되고 관리될 수 있도록 설계되었습니다. 각 서..
[MSA] SAGA 패턴은 무엇?
·
스케쥴/스터디
1. MSA에서의 트랜잭션 문제   - 분산 환경에서 단일 DBMS의 트랜잭션 기능으로 해결 불가   - Two-Phase Commit의 한계: 성능 문제, 서비스 간 통제 어려움2. SAGA 패턴   - 정의: 마이크로서비스 간 이벤트 교환으로 분산 환경에서 원자성 보장   - 특징: 트랜잭션 관리 주체가 Application, 최종 일관성 달성3. SAGA 패턴의 종류   a) Choreography-based SAGA      - 각 서비스가 자체적으로 트랜잭션 관리, 이벤트 발행      - 장점: 구성 용이      - 단점: 전체 트랜잭션 상태 파악 어려움   b) Orchestration-based SAGA      - 중앙 Saga Manager가 트랜잭션 조정      - 장점: 구현/테..
콘서트 예매 서비스에서 발생할 수 있는 동시성 이슈와 처리
·
프레임워크/자바 스프링
동시성 제어 접근 방법1. Database Unique Index개념데이터베이스 테이블의 특정 컬럼 또는 컬럼 조합에 대해 유일성을 보장하는 인덱스입니다.중복된 값이 입력되는 것을 방지합니다.장점데이터 무결성을 데이터베이스 레벨에서 보장합니다.검색 성능을 향상시킵니다.동시성 문제를 방지할 수 있습니다 (예: 중복 예약 방지).단점인덱스 유지에 따른 약간의 성능 오버헤드가 발생할 수 있습니다.대량의 데이터 입력 시 성능 저하가 발생할 수 있습니다.2. Database Locka) 비관적 락 (Pessimistic Lock)개념데이터를 읽는 시점에 락을 걸어 다른 트랜잭션의 접근을 차단합니다.장점동시성 문제를 확실하게 방지할 수 있습니다.데이터 일관성을 강력하게 보장합니다.단점동시 처리 성능이 떨어질 수 있..
[항해99 취업리부트 WIL] 8주차
·
스케쥴/스터디
Weekly I Learned: 이벤트 드리븐 아키텍처로의 전환과 나의 예약 조회 API 구현이번 주에는 기존의 모놀리식 아키텍처를 이벤트 드리븐 아키텍처로 전환하는 과정에서 많은 것을 배웠습니다. 특히 나의 예약 조회 API를 구현하면서 여러 가지 도전과 해결책을 경험했습니다.1. 한 주 동안 학습한 것들 나열이벤트 드리븐 아키텍처의 기본 개념과 구현 방법Kafka를 이용한 마이크로서비스 간 비동기 통신Redis를 활용한 캐싱 전략Server-Sent Events (SSE)를 이용한 실시간 데이터 전송분산 시스템에서의 데이터 일관성 유지 방법2. 학습한 내용의 구현 필요성기존의 모놀리식 아키텍처에서는 단일 데이터베이스를 사용하여 예약 정보를 쉽게 조회할 수 있었습니다. 하지만 마이크로서비스 아키텍처로 ..
[항해99 취업리부트 WIL] 7주차
·
스케쥴/스터디
모놀리식 아키텍처에서 이벤트 드리븐 아키텍처로1. 한 주 동안 수행한 작업예약 서비스 (Reservation Service)의 이벤트 드리븐 아키텍처로의 전환Kafka 설정 추가: Kafka 프로듀서와 컨슈머 설정을 추가하여 예약 서비스가 이벤트를 주고받을 수 있도록 준비.이벤트 클래스 작성: ReservationRequestedEvent, SeatStatusUpdatedEvent, PaymentCompletedEvent 등 예약과 관련된 이벤트 클래스를 작성.예약 요청 처리 변경: 예약 요청이 들어오면 ReservationRequestedEvent 이벤트를 Kafka를 통해 전송하도록 변경.좌석 상태 업데이트 처리: SeatStatusUpdatedEvent 이벤트를 수신하여 좌석 상태를 업데이트하고 예..
[항해99 취업리부트 WIL] 6주차
·
스케쥴/스터디
리팩토링 및 CI/CD 최적화1. 개요지난 2주 동안, 시스템 리팩토링과 CI/CD(Continuous Integration/Continuous Deployment) 최적화 작업에 중점을 두고 다양한 기술과 방법을 학습하고 적용하였습니다. 주요 학습 내용은 시스템 성능 향상, 코드 유지보수성 개선, 이벤트 기반 아키텍처 도입, 데이터 무결성 보장, 그리고 CI/CD 파이프라인 구축을 포함합니다.2. 주요 리팩토링 작업2.1 ReserveRequest 리팩토링배경: 결제 생성 요청 로직이 Reservation 엔티티에 포함되어 있어 단일 책임 원칙(SRP)에 위배되었습니다.변경 내용: 결제 생성 요청 로직을 Reservation에서 ReserveRequest로 이동하였습니다.기존: 결제 생성 로직이 Res..
[항해99 취업리부트 WIL] 5주차
·
스케쥴/스터디
Week In Learning (WIL) - 지난 두 주간의 학습 정리 주간 학습 목표: 지난 두 주 동안 MySQL 데이터베이스 설정, Docker를 활용한 개발 환경 구성, Spring Security와 JWT 인증, 이메일 인증 구현, 그리고 사용자 마이페이지 및 비밀번호 수정 기능을 학습했습니다. 첫째 주: MySQL 데이터베이스 설정:     Docker Compose를 활용한 MySQL 컨테이너 설정.     docker-compose.yml, Dockerfile, my.cnf, 초기화 스크립트 등을 통해 MySQL 환경 구성. 문제 해결:     Base64..
[항해99 취업리부트 TIL] 4주차 4일
·
스케쥴/스터디
오늘 학습한 내용은 무엇인가요?적어도 대부분의 배수문제 요약: 주어진 정수 배열에서 세 수의 조합을 생성하고, 이 조합들 중 최소 공배수를 계산하여 가장 작은 최소 공배수를 찾는 문제입니다.해결 방법 요약:입력 처리:버퍼에서 입력을 읽어와 정수 배열로 변환합니다.조합의 크기 계산:조합 공식인 ( N! / ((N-R)! \times R!) )를 사용하여 조합의 크기를 계산합니다.조합 생성:세 수의 모든 조합을 생성하고 배열에 저장합니다.최소 공배수 계산:생성된 각 조합에 대해 최소 공배수를 계산하고, 결과를 배열에 저장합니다.최소값 찾기:최소 공배수 배열에서 가장 작은 값을 찾아 출력합니다.public class Main { public static void main(String[] args) thr..
[백준] 문어 - 21313번
·
여러가지/알고리즘 & 자료구조
문어  1 초1024 MB1673112998366.780%문제 문어에게 여덟개의 팔이 있다는 사실은 잘 알려져 있다. 하지만 문어들이 자신의 팔들을 1번, 2번, 3번, ..., 8번이라고 부른다는 말은 오늘 처음 들었을 것이다! 단, 시계방향으로 오름차순이라던가 하는 규칙은 없다. (물론 그러한 문어도 존재할 수 있다.) 문제에선 편의상 팔 대신 손이라고 부르자.문어들은 정월 대보름을 맞아 강강술래를 하려고 한다. 각 문어는 양 옆의 서로 다른 두 문어와 손을 맞잡아 원을 만든다. 문어끼리 손을 잡을 때 지켜야 할 예절이 있다.서로 같은 번호의 손을 잡아야 한다.한 문어와 둘 이상의 손을 잡을 수 없다.한 손으로 여러 문어의 손을 잡을 수 없다.모든 문어들은 예의바르기 때문에 예절을 항상 따른다.강강술..
[백준] 쉽게푸는문제 - 1292번
·
여러가지/알고리즘 & 자료구조
느낀점메모리 효율성:수열을 미리 생성하지 않고 필요한 부분만 계산하는 방식은 메모리를 효율적으로 사용합니다. 이는 특히 메모리 제한이 있는 환경에서 유용할 수 있습니다.코드 간결성:수열 생성과 구간 합 계산을 동시에 수행하는 접근 방식은 코드가 더 간결하고 이해하기 쉬운 구조를 제공합니다.시간 효율성:수열을 미리 생성하는 방식은 특정 상황에서 더 빠르게 구간 합을 계산할 수 있지만, 수열 생성 자체에 많은 시간이 소요될 수 있습니다.메모리를 덜 사용하는 방식은 시간 복잡도가 더 높을 수 있습니다. 특히 입력 크기 B가 클 경우 성능에 영향을 미칠 수 있습니다.문제 요구 사항과 실제 성능:두 방식 모두 문제의 요구 사항을 만족하며, 실제 실행 시간과 메모리 사용량도 문제의 제한 내에 있습니다. 그러나 메모..
[백준] 적어도 대부분의 배수 - 1145번
·
여러가지/알고리즘 & 자료구조
느낀점코드 개선의 중요성:코드 개선을 통해 가독성과 효율성을 높일 수 있어 좋았습니다. 시간 복잡도를 유지하면서도 코드의 구조를 개선하여 더 나은 성능과 유지보수성을 확보할 수 있음을 느꼇습니다..스트림 API의 강력함:Java 스트림 API를 활용하여 복잡한 계산을 간결하고 직관적으로 표현할 수 있음을 다시 한 번 느꼈습니다. 스트림 API는 코드의 가독성을 크게 향상시킬 수 있는 강력한 도구입니다.모듈화와 함수 분리의 중요성:함수 분리와 모듈화를 통해 코드의 재사용성과 유지보수성을 높일 수 있음을 확인했습니다. 각 함수가 하나의 역할을 담당하도록 함으로써 코드의 복잡성을 줄이고, 필요한 경우 쉽게 수정할 수 있었습니다.효율적인 메모리 사용:메모리 사용 최적화를 통해 코드의 성능을 개선할 수 있음을 배..
[트러블슈팅] EC2 재시동 후 iptable 맵핑 정보 사라지는 현상 해결
·
여러가지/오류
EC2 재시동 후 iptable 맵핑 정보 사라지는 현상 해결개요 AWS EC2 인스턴스에서 포트 80으로 들어오는 HTTP 요청을 포트 8080으로 리다이렉트하는 작업 중 발생한 문제와 그 해결 과정을 다룹니다. 또한, 인스턴스 재시작 후 iptables 규칙이 유지되도록 설정하는 방법을 포함합니다. 문제가 발생한 상황포트 80으로 들어오는 HTTP 요청을 포트 8080에서 실행 중인 애플리케이션으로 리다이렉트하려는 설정 작업 중, EC2 인스턴스를 중지하고 다시 시작한 후 iptables 규칙이 사라지는 문제가 발생했습니다. 이로 인해 리다이렉션 설정이 유지되지 않았습니다. 문제의 원인EC2 인스턴스를 중지하고 다시 시작하면 iptables의 규칙이 휘발성 메모리에 저장되기 때문에 사라집니다. 이는 ..
[트러블슈팅] 80포트 요청을 8080포트로 리다이렉션하기(feat. AWS)
·
여러가지/오류
포트 80에서 포트 8080으로의 리다이렉션 설정 느낀점이번 작업을 통해 여러 가지 중요한 교훈을 얻을 수 있었습니다.1. 네트워크 인터페이스 확인의 중요성:서버 환경에 따라 네트워크 인터페이스 이름이 다를 수 있으므로, 작업 전에 항상 활성화된 인터페이스를 확인해야 합니다. 이를 통해 불필요한 오류를 피하고, 설정 작업을 더 효율적으로 수행할 수 있습니다.2. 정확한 정보의 필요성:인터넷 블로그나 튜토리얼에서 제공하는 정보는 일반적인 환경을 기반으로 하기 때문에, 이를 맹목적으로 따르기보다는 자신의 환경에 맞게 수정하는 것이 필요합니다. 특히 네트워크 인터페이스와 관련된 정보는 서버마다 다를 수 있으므로, 정확한 정보를 바탕으로 설정을 진행해야 합니다.3. AWS 보안 그룹 설정의 중요성:AWS EC2..
[트러블슈팅] Github Action을 이용한 CICD
·
여러가지/오류
개요CI/CD 파이프라인 구축 과정에서 발생한 다양한 실수와 오류, 문제의 원인, 그리고 이를 해결한 방법에 대해 상세하게 설명합니다. 주된 목적은 GitHub Actions를 활용하여 애플리케이션의 자동화된 빌드, 테스트, 배포 파이프라인을 구축하는 것입니다. 본 보고서는 구축 과정에서 발생한 문제들을 체계적으로 정리하여 유사한 프로젝트를 진행하는 개발자들에게 도움이 되고자 합니다.실수 사항, 문제의 원인 및 해결 방법Docker 빌드 오류: JAR 파일을 찾을 수 없음오류 메시지: failed to calculate checksum of ref ... lstat /tmp/buildkit-mount.../build/libs: no such file or directory문제의 원인: Docker 빌드 ..
[항해99 취업리부트 TIL] 4주차 3일
·
스케쥴/스터디
학습한 내용은 무엇인가요?동적 프로그래밍(DP) 알고리즘 개요DP는 문제를 작은 하위 문제로 나누어 해결한 후 그 결과를 결합하여 원래 문제를 해결하는 기법이다.두 가지 특징:중복되는 하위 문제최적 부분 구조구현 방식:탑다운(메모이제이션)바텀업(테이블화)피보나치 수열피보나치 수열은 DP의 대표적인 예제이다.점화식: F(n) = F(n-1) + F(n-2)초기 조건: F(0) = 0, F(1) = 1탑다운 방식재귀와 메모이제이션을 이용해 구현.중복 계산을 피하기 위해 이미 계산된 결과를 저장.int[] memo = new int[n + 1]; 배열을 -1로 초기화.fib(n, memo) 함수 호출:if (n if (memo[n] != -1) return memo[n];memo[n] = fib(n - 1, ..
[백준] 가장긴감소하는부분수열 - 11722번
·
여러가지/알고리즘 & 자료구조
가장 긴 감소하는 부분 수열1 초256 MB35656220881816962.951%문제수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} 이고, 길이는 3이다.입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)출력첫째 줄에 수열 A의 가장 긴 감소하는 부분 수열의 길이를 출력한다.예제 입력 1 복사610 30 10 20 20 10예제 출력 1 복사3코드package 가장긴감소하는부분수열;import java...
[백준] 부녀회장이될테야 - 2775번
·
여러가지/알고리즘 & 자료구조
부녀회장이 될테야 0.5 초 (추가 시간 없음)128 MB104395590145008757.510% 문제평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.입력첫 번째 줄..
[백준] 핸드폰 번호 궁합 - 17202번호
·
여러가지/알고리즘 & 자료구조
핸드폰 번호 궁합 2 초256 MB35332684238377.622%문제어린시절 다들 한 번씩은 이름으로 궁합을 본 적이 있을 것이다. 이것과 비슷한 방식으로 중앙대학교에는 핸드폰 번호 궁합을 보는 것이 유행이라고 한다.핸드폰 번호 궁합을 보기 위해서는 먼저 궁합을 보고싶은 두 중앙대생 A와 B의 핸드폰 번호에서 맨 앞의 010과 "-"(하이픈)을 모두 제외한 후, A부터 시작하여 한 숫자씩 번갈아가면서 적는다. 그리고 인접한 두 숫자끼리 더한 값의 일의 자리를 두 숫자의 아래에 적어나가면서 마지막에 남는 숫자 2개로 궁합률을 구하게 된다.예를 들어, 아래의 그림과 같이 A의 번호가 010-7475-9336 이고, B의 번호가 010-3619-5974 이면, 7346715995393764에서 시작하여 0..
[백준] 가장 긴 증가하는 부분 수열 - 11053번
·
여러가지/알고리즘 & 자료구조
가장 긴 증가하는 부분 수열1 초256 MB169140679584509838.082%문제수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)출력첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.예제 입력 1 복사610 20 10 30 20 50예제 출력 1 복사4가장 긴 증가하는 부분 수열(LIS, Longest Incr..
DP(Dynamic Programming) 핥아보기
·
여러가지/알고리즘 & 자료구조
동적 프로그래밍(Dynamic Programming, DP) 알고리즘은 문제를 작은 하위 문제들로 나누어 해결한 다음, 그 결과를 결합하여 원래의 문제를 해결하는 기법입니다. DP는 주로 다음 두 가지 특징을 가진 문제에 사용됩니다:중복되는 하위 문제:동일한 하위 문제가 여러 번 반복해서 계산되는 경우.최적 부분 구조:문제의 최적 해가 하위 문제들의 최적 해로 구성될 수 있는 경우.DP 알고리즘은 크게 두 가지 방식으로 구현됩니다:탑다운(메모이제이션, Memoization):재귀를 사용하여 문제를 푸는 방식입니다.이미 계산된 하위 문제의 결과를 저장해두고, 동일한 하위 문제가 다시 등장할 때 저장된 값을 재사용합니다.이 방식은 재귀 호출로 인해 스택 오버플로우가 발생할 수 있으므로 주의가 필요합니다.바텀..
[항해99 취업리부트 TIL] 4주차 3일
·
카테고리 없음
### 학습한 내용 🧑‍💻1. **그리디 알고리즘(Greedy Algorithm)**:   - 각 단계에서 최적의 선택을 하여 최종 해답에 도달하는 근시안적인 방법론.   - 주요 속성:     - **탐욕 선택 속성(Greedy Choice Property)**: 각 단계의 최적 선택이 전체 최적해를 보장함.     - **최적 부분 구조(Optimal Substructure)**: 전체 문제의 최적해가 부분 문제의 최적해로 구성됨.   - 주요 예시:     - **거스름돈 문제**: 가장 큰 동전부터 선택하여 거스름돈을 최소 동전 개수로 계산.     - **체육복 문제**: 체육복을 잃어버린 학생들에게 여벌 체육복을 빌려주는 문제.   - 그리디 알고리즘이 항상 최적해를 보장하지 않는 경우도 ..
[백준] 우유축제 - 14720번
·
여러가지/알고리즘 & 자료구조
우유 축제 1 초256 MB76094512400361.115%문제영학이는 딸기우유, 초코우유, 바나나우유를 좋아한다.입맛이 매우 까다로운 영학이는 자신만의 우유를 마시는 규칙이 있다.맨 처음에는 딸기우유를 한 팩 마신다.딸기우유를 한 팩 마신 후에는 초코우유를 한 팩 마신다.초코우유를 한 팩 마신 후에는 바나나우유를 한 팩 마신다.바나나우유를 한 팩 마신 후에는 딸기우유를 한 팩 마신다. 영학이는 우유 축제가 열리고 있는 우유거리에 왔다. 우유 거리에는 우유 가게들이 일렬로 늘어서 있다.영학이는 우유 거리의 시작부터 끝까지 걸으면서 우유를 사먹고자 한다.각각의 우유 가게는 딸기, 초코, 바나나 중 한 종류의 우유만을 취급한다.각각의 우유 가게 앞에서, 영학이는 우유를 사마시거나, 사마시지 않는다.우유거리..
[백준] 한조서열정리하고옴ㅋㅋ - 14659번
·
여러가지/알고리즘 & 자료구조
한조서열정리하고옴ㅋㅋ2 초256 MB115764740383740.638%문제“반갑다. 내 이름은 반고흐#31555! 조선 최고의 활잡이지. 오늘도 난 금강산 위에서 적들을 노리고 있지. 내 앞에 있는 적들이라면 누구도 놓치지 않아! 좋아, 이제 곧 월식이 시작되는군. 월식이 시작되면 용이 적들을 집어삼킬 것이다. 잘 봐두어라! 마장동 활잡이 반고흐#31555님의 실력을-!”반고흐#31555는 자기 뒤쪽 봉우리에 덩기#3958이 있음을 전혀 모르고 있었다. 덩기#3958도 반고흐#31555와 마찬가지로 월식이 시작되면 용을 불러내어 눈앞에 있는 다른 활잡이들을 모두 처치할 생각이다. 사실, 반고흐#31555와 덩기#3958 뿐만 아니라 금강 산맥의 N개 봉우리에 있는 모든 활잡이들이 같은 생각을 가지고 있..
[백준] 거스름돈 - 5585번
·
여러가지/알고리즘 & 자료구조
거스름돈1 초128 MB45753299952555965.531%문제타로는 자주 JOI잡화점에서 물건을 산다. JOI잡화점에는 잔돈으로 500엔, 100엔, 50엔, 10엔, 5엔, 1엔이 충분히 있고, 언제나 거스름돈 개수가 가장 적게 잔돈을 준다. 타로가 JOI잡화점에서 물건을 사고 카운터에서 1000엔 지폐를 한장 냈을 때, 받을 잔돈에 포함된 잔돈의 개수를 구하는 프로그램을 작성하시오.입력입력은 한줄로 이루어져있고, 타로가 지불할 돈(1 이상 1000미만의 정수) 1개가 쓰여져있다.출력제출할 출력 파일은 1행으로만 되어 있다. 잔돈에 포함된 매수를 출력하시오.예제 입력 1 복사380예제 출력 1 복사4예제 입력 2 복사1예제 출력 2 복사15코드package 거스름돈;import java.io.Bu..
[백준] A->B - 16953번
·
여러가지/알고리즘 & 자료구조
A → B2 초512 MB55712229191817439.686%문제정수 A를 B로 바꾸려고 한다. 가능한 연산은 다음과 같은 두 가지이다.2를 곱한다.1을 수의 가장 오른쪽에 추가한다. A를 B로 바꾸는데 필요한 연산의 최솟값을 구해보자.입력첫째 줄에 A, B (1 ≤ A 출력A를 B로 바꾸는데 필요한 연산의 최솟값에 1을 더한 값을 출력한다. 만들 수 없는 경우에는 -1을 출력한다.예제 입력 1 복사2 162예제 출력 1 복사52 → 4 → 8 → 81 → 162예제 입력 2 복사4 42예제 출력 2 복사-1예제 입력 3 복사100 40021예제 출력 3 복사5100 → 200 → 2001 → 4002 → 40021접근법이 문제는 정수 A를 B로 바꾸기 위해 가능한 두 가지 연산을 이용하여 최단 경로..