전체 글

전체 글

    [Java] 백준 1285 (동전 뒤집기) Gold 1

    Problem : https://www.acmicpc.net/problem/1285 1285번: 동전 뒤집기 첫째 줄에 20이하의 자연수 N이 주어진다. 둘째 줄부터 N줄에 걸쳐 N개씩 동전들의 초기 상태가 주어진다. 각 줄에는 한 행에 놓인 N개의 동전의 상태가 왼쪽부터 차례대로 주어지는데, 앞면이 위 www.acmicpc.net Approach Greedy + Bitmask 문제이다. 주요 로직은 다음과 같다. N x N 행렬이고, sum은 뒷면 동전의 총 개수이다. 행을 기준으로 뒤집을 행을 선택한다. (이 부분은 2^n 개수 만큼 존재한다.) 101 이라면 0, 2번째 행을 뒤집는다. 이제 선택한 행들을 뒤집을 건데, 열을 기준으로 먼저 뒤집는다. 101 이라면, 0,1,2 열 순서대로 0번째 행..

    [DDD&MSA] 마이크로서비스 애플리케이션 패턴

    마이크로서비스 애플리케이션 패턴은 실제로 개발자가 구현해야 할 애플리케이션 영역에서, 좋은 마이크로서비스 애플리케이션을 구성하기 위한 패턴이다. 마이크로서비스의 구성과 관계를 설계할 때도 유연성, 확장성, 독립성 등을 고려해야 한다. 하나의 업무 기능은 보통 프론트엔드와 백엔드의 연계로 구현된다. 백엔드의 업무 기능 하나가 변경되어 재배포가 필요할 때, 프론트엔드가 클래식한 단일 모노리스로 구성되어 있다면, 프론트엔드는 하나의 덩어리이기 때문에 재배포가 필요없는(변경이 없는) 기능들 까지도 함께 빌드하고 배포하여야 한다. 이는 백엔드가 모노리스로 구성되었을 때와 똑같은 문제를 안게 된다. UI 컴포지트 패턴 또는 마이크로 프론트엔드 이를 위한 해결 방안이 UI 컴포지트(Composite) 패턴과 마이크로..

    [Java] 백준 2109 (순회강연) Gold 4

    Problem : https://www.acmicpc.net/problem/2109 2109번: 순회강연 한 저명한 학자에게 n(0 ≤ n ≤ 10,000)개의 대학에서 강연 요청을 해 왔다. 각 대학에서는 d(1 ≤ d ≤ 10,000)일 안에 와서 강연을 해 주면 p(1 ≤ p ≤ 10,000)만큼의 강연료를 지불하겠다고 알려왔다. www.acmicpc.net Approach 우선순위 큐를 사용한 그리디(Greedy) 알고리즘 문제이다. 먼저 pay 기준 내림차순으로 정렬된 우선순위 큐가 필요하다. pay가 같을 경우에는 day가 더 작은 것이 우선이다. 그리고 주어진 입력 d의 최대 크기만큼의 cost 배열을 선언한다. cost[i] 는 i일에 얼마짜리 강의를 하는지를 저장한다. cost 배열의 총..

    [DDD&MSA] 마이크로서비스 운영과 관리를 위한 플랫폼 패턴

    MSA 시스템을 구성하는 수많은 마이크로서비스를 하나하나 수동으로 빌드하고 배포하는 것은 비효율적이다. 따라서 이러한 과정을 하나하나 통제하고 자동화하는 것이 중요해졌다. 개발 지원 환경: 데브옵스 인프라 구성 데브옵스(DevOps)는 개발과 운영이 분리되지 않은 개발 및 운영을 병행할 수 있는 조직 또는 그 문화를 의미한다. 여기서 말하는 데브옵스 환경은 개발과 운영을 병행 가능하게끔 높은 품질로 소프트웨어를 빠르게 개발하도록 지원하는 빌드, 테스트, 배포를 위한 자동화 환경을 말한다. 과거의 수동 빌드 및 배포는 다음과 같은 과정을 따랐다. 개발자는 개발 환경에서 애플리케이션을 완성하고(컴파일 및 수동 테스트 포함으로 인한 오류 수정 포함), 테스트 환경에서 수동 테스트한 후 발생한 오류 를 수정한 ..

    [Java] 백준 16933 (벽 부수고 이동하기 3) Gold 1

    Problem : https://www.acmicpc.net/problem/16933 16933번: 벽 부수고 이동하기 3 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자. www.acmicpc.net Approach BFS문제이다. 백준 14442 (벽 부수고 이동하기 2) 문제에 조건이 하나 더 달린 문제이다. 여기서의 visited배열은 4차원 배열이다. visited[n][m][k][a] 는 (n, m) 위치를 k번 벽을 부신 채로 낮(a = 0) 혹은 밤(a = 1)에 방문했다는 뜻이다. 문제 풀이의 주요 로직은 다음과 같다. 낮이라..

    [Java] 백준 14442 (벽 부수고 이동하기 2) Gold 3

    Problem : https://www.acmicpc.net/problem/14442 14442번: 벽 부수고 이동하기 2 첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자. www.acmicpc.net Approach 대표적인 BFS문제이다. 일단 visited[i][j][k] 는 (i, j) 위치에 k번 벽을 부순 채로 도달했는지를 나타내는 배열이다. 문제를 푸는 주요 BFS 로직은 다음과 같다. 현재 위치에서 상하좌우 방향으로 벽이 아니라면 cnt++ 한 후, 이동한다. (이 때 visited 배열에 벽을 부순 횟수는 증가시키지 않고 표시..

    [DDD&MSA] MSA(Microservice Architecture) 구성요소

    MSA(Microservice Architecture) 구성요소 소프트웨어 아키텍트인 크리스 리처드슨(Chris Richardson)은 마이크로서비스 아키텍처 패턴을 인프라 패턴, 애플리케이션 인프라 패턴, 애플리케이션 패턴 등으로 분류해서 정의했다. 시스템을 개발하는 개발자의 입장에서 마이크로서비스 시스템을 구현하기 위해 밟아야 할 단계들을 알아보자. 우선은 인프라가 구축돼야 하고, 그 위에 미들웨어가 올라가고, 미들웨어 위에서 애플리케이션이 동작해야 한다. 따라서 인프라, 미들웨어 영역을 대신하고 있는 플랫폼, 애플리케이션 관련 패턴들을 살펴보자. 인프라 구성요소: 마이크로서비스를 지탱하는 하부구조 인프라를 구축하는 데 필요한 구성요소 플랫폼 패턴: 인프라 위에서 마이클로서비스의 운영과 관리를 지원하..

    [Java] 백준 16954 (움직이는 미로 탈출) Gold 4

    Problem : https://www.acmicpc.net/problem/16954 16954번: 움직이는 미로 탈출 욱제는 학교 숙제로 크기가 8×8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은 빈 칸 또는 벽 중 하나이다. 욱제의 캐릭터는 가장 왼쪽 아랫 칸에 있고, 이 캐릭터는 가장 오른쪽 www.acmicpc.net Approach 이동 가능한 곳이 동적으로 변하는 환경에서의 BFS문제이다. 변하는 방법은 위에서 아래로 한 칸씩 내려오는 방식이다. 문제를 푸는 로직은 다음과 같다. 현재 위치가 벽이 아니라면, 현재 위치 포함, 상하좌우 대각선4방향으로 이동한다. 벽을 위에서 아래 방향으로 한 칸씩 내린다. 무한 루프를 방지하기 위해 방문 여부를 나타내는 flag 변수를 하나 둔다...

    [Java] 백준 3055 (탈출) Gold 5

    Problem : https://www.acmicpc.net/problem/3055 3055번: 탈출 사악한 암흑의 군주 이민혁은 드디어 마법 구슬을 손에 넣었고, 그 능력을 실험해보기 위해 근처의 티떱숲에 홍수를 일으키려고 한다. 이 숲에는 고슴도치가 한 마리 살고 있다. 고슴도치는 제 www.acmicpc.net Approach 이동 가능한 곳이 동적으로 변하는 환경에서의 BFS문제이다. 문제를 푸는 주요 로직은 다음과 같다. 다음에 물이 찰 예정인 곳은 비버가 방문할 수 없으니 물을 먼저 전파시키고 비버를 이동시킨다. 물을 전파시킨다. 비버를 이동할 수 있는(물이 차지 않은) 곳들을 방문한다. 즉, 비버따로 물따로 각각 BFS가 수행되어야 한다. (ps. cnt 배열을 사용하지 않고 Point 클래..

    [DDD&MSA] 마이크로서비스(Microservice) 등장배경, 리액티브 선언

    리액티브 선언: 현대 애플리케이션이 갖춰야할 바람직한 속성들 2014년 요나스 보네르(Jonas Bonér) 등이 선언한 리액티브 선언문(The Reactive Manifesto)이다. 리액티브 시스템이란 다양한 상황에 따라 빠르고 적절하게 반응하는 시스템을 의미한다. 리액티브 선언문에서는 다음 4가지 특성을 강조하고, 이러한 요건을 만족하는 시스템을 리액티브 시스템이라고 정의한다. 응답성(Responsive): 사용자에게 신뢰성 있는 응답을 빠르고 적절하게 제공하는 것을 의미한다. 탄력성(Resilient): 장애가 발생하거나 부분적으로 고장 나더라도 시스템 전체가 고장 나지 않고 빠르게 복구하는 능력을 의미한다. 유연성(Elastic): 시스템의 사용량에 변화가 있더라도 균일한 응답성을 제공하는 것을..