전체 글

전체 글

    객체지향 프로그래밍(OOP)의 특징(4)과 설계 원칙(5)

    객체지향 프로그래밍(OOP) 객체지향 프로그래밍(Object-Oriented Programming)은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 여러 개의 독립된 단위(객체)들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. 객체지향 프로그래밍은 다음과 같은 장점을 가진다. 코드의 재사용성 증가 유지보수의 용이 간결한 코드 OOP의 5가지 특성 관점에 따라 4가지 (추상화, 캡슐화, 다형성, 상속) 로 보기도 한다. 추상화, Abstraction 추상화는 인터페이스로 클래스들의 공통적인 특성(변수, 메소드)들을 묶어 표현한다. 인터페이스와 구현을 분리함으로써, 객체가 가진 특성 중 필수 속성만으로 객체를 묘사하고 유사성만을 표현하며 세부적인..

    [Java] 백준 12886 (돌 그룹) Gold 5

    Problem : https://www.acmicpc.net/problem/12886 12886번: 돌 그룹 오늘 강호는 돌을 이용해 재미있는 게임을 하려고 한다. 먼저, 돌 세개는 그룹으로 나누어져 있으며 각각의 그룹에는 돌이 A, B, C개가 있다. 강호는 모든 그룹에 있는 돌의 개수를 같게 만들려고 www.acmicpc.net Approach DFS를 사용하여 풀이한 문제이다. BFS로도 풀이가 가능한 것 같다. 새로 만든 숫자와 기존 숫자를 이용하여야 하기 때문에 DFS가 먼저 생각이나서 DFS로 풀이하였다. 먼저 처리할 수 있는 예외를 보자. (a + b + c) % 3이 0이 아니라면 세 숫자를 어떻게 선택하더라도, 서로 같게 만들 수 없다. 문제 풀이 로직은 다음과 같다. 숫자 a, b, c..

    [Java] 백준 14502 (연구소) Gold 5

    Problem : https://www.acmicpc.net/problem/14502 14502번: 연구소 인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크 www.acmicpc.net Approach 완전탐색(BruteForce)과 BFS를 함께 사용하는 문제이다. 문제 풀이 주요 로직은 다음과 같다. 0인 곳들 중 3군데를 골라서 벽을 세운다. 벽을 3개 세웠으면 그 상태에서 BFS를 수행하여 바이러스를 전파시킨다. 전파 시킨 뒤에 0의 개수를 찾는다. 모든 경우를 다 탐색하여, 안전한 구역의 최대 개수를 구한다. Code import java.io.*; import j..

    [Java] 백준 6087 (레이저 통신) Gold 4

    Problem : https://www.acmicpc.net/problem/6087 6087번: 레이저 통신 크기가 1×1인 정사각형으로 나누어진 W×H 크기의 지도가 있다. 지도의 각 칸은 빈 칸이거나 벽이며, 두 칸은 'C'로 표시되어 있는 칸이다. 'C'로 표시되어 있는 두 칸을 레이저로 통신하기 위해서 www.acmicpc.net Approach BFS + DP 문제라고 볼 수 있다. 특정 위치 (x, y)를 방문하는 방법은 여러 방법이 있는데, 그 중 방향 전환을 최소로 하는 방문을 찾는 문제이다. 문제에서 거울이라는 개념이 나오는데, 쉽게 말하여 방향이 변하는 곳엔 거울을 놓을 수 밖에 없다. 따라서, 목표 위치 (x, y)를 방문하는 방법 중, 방향 전환이 최소인 방문을 찾으면 된다. cha..

    [Java] 백준 1963 (소수 경로) Gold 4

    Problem : https://www.acmicpc.net/problem/1963 1963번: 소수 경로 소수를 유난히도 좋아하는 창영이는 게임 아이디 비밀번호를 4자리 ‘소수’로 정해놓았다. 어느 날 창영이는 친한 친구와 대화를 나누었는데: “이제 슬슬 비번 바꿀 때도 됐잖아” “응 지금 www.acmicpc.net Approach 소수를 찾는 알고리즘과 BFS 개념으로 풀 수 있는 문제이다. 문제 풀이의 주요 로직은 다음과 같다. 먼저 간단하게 에라토스테네스의 체 개념을 이용하여 1 ~ 9999 사이의 숫자들 중 소수를 판별한다. 그리고 난 뒤 현재 숫자에서 숫자 하나만 변경하며 BFS를 수행한다. 숫자를 하나씩 바꾸는 부분을 구현하는게 꽤 까다로울 수 있다. String을 사용할까도 생각해봤지만,..

    Head First: Design Patterns - 컴파운드 패턴(Compound Pattern): MVC 패턴

    디자인 패턴: 컴파운드 패턴(Compound Pattern) 이 포스팅은 Head First: Design Patterns 책을 보고, 개인적으로 정리한 포스팅입니다. Compound Pattern 이란? 컴파운드 패턴(Compound Pattern은 일련의 패턴을 함께 사용하여 다양한 디자인 문제를 해결한다. 반복적으로 생길 수 있는 일반적인 문제를 해결하기 위한 용도로 사용된다. 간단히 설명하면 패턴으로 이루어진 패턴이다. 대표적인 컴파운드 패턴: MVC 패턴 MVC(Model-View-Controller) 패턴는 하나의 애플리케이션, 프로젝트를 구성할 때 그 구성요소를 모델, 뷰, 컨트롤러라는 세가지 역할로 구분한 패턴이다. 요약하면 다음과 같다. Model: 애플리케이션의 데이터, 자료를 의미한다..

    [DDD & MSA] 마이크로서비스(Microservice)의 개념과 필요조건

    마이크로서비스(Microservice) 란? 유명 아키텍트 구루인 마틴 파울러(Martin Fowler)는 그동안의 마이크로서비스(microservice) 발전 흐름을 정리해 마이크로서비스의 등장 배경과 개념, 특징을 설명하였다. 해당 아티클은 본 포스팅의 가장 마지막에 연결해 두겠다. 모노리스(Monolith) vs 마이크로서비스(Microservice) 전통적인 시스템 구조인 모노리스(monolith) 구조는 다음 그림과 같다. 서버 측 애플리케이션이 일체, 즉 논리적인 단일체로서 아무리 작은 변화에도 새로운 버전으로 전체를 빌드해서 배포해야 한다. 그리고 일체식 애플리케이션은 단일 프로세스에서 실행된다. 따라서 확장이 필요한 경우, 특정 기능만 확장할 수 없고 전체 애플리케이션을 동시에 확장해야 한..

    [Java] 백준 14395 (4연산) Gold 5

    Problem : https://www.acmicpc.net/problem/14395 14395번: 4연산 첫째 줄에 정수 s를 t로 바꾸는 방법을 출력한다. s와 t가 같은 경우에는 0을, 바꿀 수 없는 경우에는 -1을 출력한다. 가능한 방법이 여러 가지라면, 사전 순으로 앞서는 것을 출력한다. 연산의 아 www.acmicpc.net Approach BFS문제이다. 하지만 배열을 사용하여 풀이한다면, 메모리초과를 만날 것이다. Set 에 방문한 곳들만 추가하여, 메모리를 절약하여야 한다. 이것이 가능한 이유는 1 ~ t범위 안에 실제로 방문할 수 있는 숫자는 전체 숫자 대비 몇개 안되기 때문이다. 문제 풀이에 앞서 입력에 따라 간단히 처리할 수 있는 부분과, 필요한 로직을 단순화 시켜보자. s == t..

    [Java] 백준 1062 (가르침) Gold 4

    Problem : https://www.acmicpc.net/problem/1062 1062번: 가르침 첫째 줄에 단어의 개수 N과 K가 주어진다. N은 50보다 작거나 같은 자연수이고, K는 26보다 작거나 같은 자연수 또는 0이다. 둘째 줄부터 N개의 줄에 남극 언어의 단어가 주어진다. 단어는 영어 소문 www.acmicpc.net Approach 조합(Combination)을 이용한 완전탐색(BruteForce)문제이다. 처음에는 조합을 list로 구현하였으나, 시간초과를 받았다. 그래서 총 알파벳의 개수인 26 크기의 배열을 가지고 사용 여부를 체크하며 조합을 구성하였다. 조합을 구현하기 전에 입력에 따라 간단히 처리할 수 있는 부분들을 짚어보자. N은 주어진 단어의 개수, K개 만큼 문자를 배울..

    [Java] 백준 16198 (두 동전) Gold 4

    Problem : https://www.acmicpc.net/problem/16197 16197번: 두 동전 N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고, www.acmicpc.net Approach 백트랙킹(Backtracking)을 이용한 완전탐색(BruteForce)문제 이다. BFS로도 풀이가 가능할 것 같다. 먼저 두개 동전의 위치를 찾는다. (입력으로 map을 구성하면서 찾을 수 있다.) 그리고 다음 작업을 반복한다. 두 동전을 상하좌우 방향으로 굴려본다. 굴렸을 때 3가지 상황이 발생한다. 두 동전이 모두 떨어지면 더 이상 굴려보지 않는다. (돌..