전체 글

전체 글

    [Java] 백준 21773 (가희와 프로세스 1) Gold 5

    Problem : https://www.acmicpc.net/problem/21773 21773번: 가희와 프로세스 1 1초일 때 부터 4초일 때 상황을 그림으로 나타내면 아래와 같습니다. 아래 그림에서 주황색은 특정 시점에 스케쥴러가 선택한 프로세스를 의미합니다. www.acmicpc.net Approach 우선순위 큐(PriorityQueue) 를 이용한 문제이다. 문제의 로직은 다음과 같다. 레디 큐에서 가장 우선순위가 높은 프로세스를 꺼내 1초동안 실행시킨다. 꺼낸 프로세스를 제외한 레디 큐에 있는 모든 프로세스의 우선순위는 1증가한다. 위 로직을 구현하려면, 먼저 우선순위 큐의 정렬 기준을 확립해야 한다. 프로세스의 우선순위 기준 내림차순이 필요할 것이다. 이제 우선순위큐에서 프로세스를 하나 뽑..

    [Java] 백준 1891 (사분면) Gold 4

    Problem : https://www.acmicpc.net/problem/1891 1891번: 사분면 첫 줄에 이동시키려는 사분면 조각 번호의 자릿수를 나타내는 정수 d와, 그 사분면 조각의 번호가 주어진다. (1≤d≤50) 둘째 줄에는 이동의 내용을 나타내는 두 정수가 x, y가 주어진다. (|x|, |y|≤2 www.acmicpc.net Approach 분할 정복(Divide & Conquer)을 구현한 문제이다. 아래와 같이 두 가지 기능을 구현하여야 한다. 그리고 순서대로 수행하면서 답을 도출한다. 주어진 사분면 숫자의 위치 (x, y)를 찾는다. 그리고 그 위치에 주어진 이동 횟수를 더한 위치를 찾는다. 구한 위치의 사분면 숫자를 구한다. 1번 기능의 경우, 주어진 사분면 숫자를 앞에서부터 한..

    [Java] 백준 1201 (NMK) Platinum 3

    Problem : https://www.acmicpc.net/problem/1201 1201번: NMK 첫째 줄에 세 정수 N, M, K가 주어진다. www.acmicpc.net Approach 알고 보면 쉬운데 그걸 알기까지가 어려웠던 Greedy 문제이다. 먼저 유효하지 않은 n, m, k를 찾아보자. (m + k) - 1 > n: 1 ~ n 까지의 숫자가 모두 증가하는 수열 혹은 감소하는 수열에 속한다고 가정할 때, 두 수열을 더했을 때의 길이 m + k = n + 1이다. (두 수열은 적어도 하나의 숫자를 공유하기 때문이다.) 그렇기 때문에 (m + k) - 1 > n 라면 길이 m의 증가수열 + 길이 k의 감소수열은 만들 수 없다. 각 수열을 구하는 방법은 다음과 같다. 길이 m의 증가수열을 만..

    [DDD&MSA] 마이크로서비스 설계

    소프트웨어 설계 모듈화의 근본적인 가치는 각 모듈을 기능적으로 응집성을 높게(High Cohesion), 타 기능과의 결합도는 낮게(Low Coupling) 하는 것이다. 마이크로서비스 설계에서도 마찬가지이다. 마이크로서비스 도출 방법 마이크로서비스가 비즈니스의 변화 속도를 지원하면서 독립적으로 변경 및 배포되려면 각 마이크로서비스가 다른 서비스와 의존하지 않게 도출해야 한다. 따라서 시스템의 어떤 비즈니스 기능들을 묶어서 독립적인 마이크로서비스로 도출할 것인가를 결정하는 것이 매우 중요하다. 비즈니스 능력에 근거한 도출 크리스 치러드슨은 비즈니스 능력(capability)에 따라 서비스로 식별할 수 있다고 주장한다. 비즈니스 능력은 '비즈니스 가치를 생산하기 위해 하는 일'이라고 정의하며, 곧 '조직이..

    [DDD&MSA] 도메인 주도 설계와 마이크로서비스

    마이크로서비스를 만들기 위한 가장 효율적인 프로세스는 실제로 동작하는 제품 중심의 반복/점진적 애자일 개발 프로세스이다. 피드백을 통한 지속적인 개선을 추구하는 애자일 프로세스는 가장 효율적인 의사소통 구조와 협업 체계를 가진 다기능 팀을 필요로 하고, 그 다기능 팀이 만들어내는 결과물이 마이크로서비스이다. 애자일에는 빨리, 자주 실패를 경험해 보는 것이 중요하기 때문에 단순한 설계를 통해 우선 최소한의 실제로 동작하는 제품(MVP; Minimum Viable Product)을 만들어 자주 배포하는 것이 중요하다. 이러한 과정을 통하여 각 개발팀에 맞는 최적의 개발 프로세스를 지속적으로 향상시킬 수 있다. 애자일 문화는 어느정도 체계적인 소프트웨어 개발 문화에서 시작했다. 따라서 아직 개발 문화가 성숙하..

    [Java] 백준 2873 (롤러코스터) Platinum 3

    Problem : https://www.acmicpc.net/problem/2873 2873번: 롤러코스터 첫째 줄에 가장 가장 큰 기쁨을 주는 롤러코스터는 가장 왼쪽 위 칸부터 가장 오른쪽 아래 칸으로 어떻게 움직이면 되는지를 출력한다. 위는 U, 오른쪽은 R, 왼쪽은 L, 아래는 D로 출력한다. 정답 www.acmicpc.net Approach Greedy 문제지만 구현이 좀 필요하다. 일단 그리디한 생각은 다음과 같다. r행 c열 표가 존재할 때, r, c 중 하나라도 홀수라면 표의 모든 곳을 방문할 수 있다. ㄹ 모양 혹은 ㄹ 을 y=x 대칭시킨 모양으로 방문한다면 모든 곳을 지날 수 있다. r, c 모두 짝수라면, 표 중 단 한 곳을 제외하고 모든 곳을 방문할 수 있다. 시작점이 흰색인 체스판으..

    [DDD&MSA] 마이크로서비스 애플리케이션 아키텍처

    관심사의 분리, Separation of Concerns 비즈니스 로직: 보통 시스템의 목적인 비즈니스 영역의 업무 규칙(Rule), 흐름(Flow), 개념(Concept)을 표현하는 용어다. 개발자의 역할은 문제 영역의 비즈니스 로직을 분석 및 이해하고 프로그래밍 언어라는 도구로 기능을 잘 동작하게 하고 이해하기 쉽고 변경하기 쉬운 시스템을 만드는 일이다. 관심사의 분리 원칙은 애플리케이션 아키텍처 설계 원칙 중 하나이다. 이것은 시스템의 각 영역이 처리하는 관심사가 분리되어 잘 관리돼야 한다는 의미이고, 시스템을 이해하고 변경하기 쉽게 만들어준다. 이 원칙에 따라 각 영역은 고유 관심사에 의해 분리되고 집중돼야 한다. 기술과 비즈니스 로직을 분리했을 때, 시스템을 이해하기 쉬워지므로 복잡성이 낮아지고..

    [Java] 백준 12904 (A와 B) Gold 5

    Problem : https://www.acmicpc.net/problem/12904 12904번: A와 B 수빈이는 A와 B로만 이루어진 영어 단어가 존재한다는 사실에 놀랐다. 대표적인 예로 AB (Abdominal의 약자), BAA (양의 울음 소리), AA (용암의 종류), ABBA (스웨덴 팝 그룹)이 있다. 이런 사실에 놀란 수 www.acmicpc.net Approach Greedy한 문제이다. 주어진 문자열 S -> T를 만드는 것이 아니라, 규칙을 역으로 적용하여 T를 S길이와 같은 문자열로 만들고, 그 문자열과 S를 비교하여 같은지를 체크하면 된다. 주요 로직은 다음과 같다. 문자열 T의 맨 오른쪽 글자가 'A'라면 그냥 삭제한다. 문자열 T의 맨 오른쪽 글자가 'B'라면 삭제한 뒤, 뒤..

    [Java] 백준 12970 (AB) Gold 4

    Problem : https://www.acmicpc.net/problem/12970 Approach Greedy 문제이다. 먼저 간단한 규칙을 알아보자. A의 개수 a, B의 개수 b일 때, (A, B) 쌍의 최대 개수는 a * b 개이다. (A~AB~B 형태의 문자열) 그리고 길이가 N 인 문자열에서 (A, B) 쌍의 최대 개수는 A의 개수가 N / 2개이고, B의 개수가 N - a 개일 때이다. 또한, a개의 A와 b개의 B로 만들 수 있는 쌍의 범위는 0 ~ a * b개이다. 문제 풀이의 주요 로직은 다음과 같다. A와 B를 각각 늘리고 줄이면서 a * b >= k 인 (a, b) 를 찾는다. 길이 N 만큼 B를 가득 채우고, 앞에서부터 a - 1 개만큼 A를 삽입한다. (현재 (a - 1) * ..

    [Java] 백준 1744 (수 묶기) Gold 4

    Problem : https://www.acmicpc.net/problem/1744 1744번: 수 묶기 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 www.acmicpc.net Approach Greedy한 문제이다. 아무 위치에 있는 두 수를 선택해도 되기 때문에, 먼저 정렬을 수행하는게 선택하기에 편하다. 문제 풀이에 앞서, 상식을 이용할 필요가 있다. 음수 두개를 곱하는 것이, 음수 두개를 더하는 것보다 값이 크다. 음수와 0은 곱하는 것이, 양수와 0은 더하는 것이 값이 크다. -1 두 개는 곱하는 것이, 1 두 개는 더하는 것이 값이 크다. ..