자바(20)
-
[Design Pattern] 데코레이터 패턴(Decorator Pattern)
Head First Design Patterns를 읽고 학습한 내용을 기록합니다. 정의 데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다. 예제 커피 주문 프로그램을 만든다고 생각해보자. 당연히 커피의 종류가 정의 되어야 할것이다. 일반적으로 아래처럼 만들수 있을것이다. Beverage는 추상클래스이며 Espresso , DarkRoast등 서브클래스가 확장해서 사용하게 된다. 위 구조에서 커피에 두유와 모카 토핑을 하려면 어떻게 해야할까? 첫번째 방법으로는 아래처럼 커피와 토핑이 조합가능한 모든 경우를 서브 클래스로 정의하는것이다. 디카페인 커피(Decaf)에 두유,모카를 토핑하는 경우를 정의했는데..
2021.02.05 -
[Design Pattern] 옵저버 패턴(Observer Pattern)
Head First Design Patterns를 읽고 학습한 내용을 기록합니다. 정의 옵저버 패턴에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다. 특정 객체에 변경이 발생했을때 그 객체에 의존하는 모든 객체에게 변경 사실을 알려 줄 수 있는 디자인 패턴이다. 책에선 신문 발행-구독을 예로 설명하고 있다. 여기서 정보를 구독하는 구독자를 옵저버(Observer)라고 부른다. 옵저버 패턴에서 발행자와 구독자는 느슨한 결합으로 연결되어 있는데 이 뜻은 두 객체가 상호작용을 하긴 하지만 서로가 내부적으로 어떤일을 하는지는 관심이 없다는 걸 의미한다. 발행자는 데이터를 제공만 할 뿐이지 구독자들이 ..
2021.02.01 -
[Design Pattern] 전략패턴(Strategy Pattern)
Head First Design Patterns를 학습한 내용을 기록합니다. 게임에 존재하는 몇가지 종류의 오리를 만들어 보려고한다. 이를 클래스로 설계하면 아래와 같이 할 수 있을것이다. Duck이라는 클래스를 선언하고 quack()과 swim() 메소드를 구현한다. display()는 선언만하고 구현하진 않는다. 각 서브클래스 오리들(MallardDuck , ReadheadDuck)은 수퍼클래스 Duck을 상속받아서 오리의 특색에 맞게 display를 구현한다. 현재 구조를 보면 모든 오리가 똑같이 수영하고 꽥꽥 소리를 낸다. 위 클래스 설계에서 오리가 날 수 있도록 기능을 추가하려면 어떻게 하면될까?? 아래의 방식으로 설계하면 각 오리별로 메소드를 추가할 필요 없이 손쉽게 모든 오리들이 날 수 있도..
2021.01.29 -
[알고리즘/자바] 백준 9252번 - LCS 2
9252번: LCS 2 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net 처음에 LCS를 푸는 알고리즘을 모르고 접근했다가 한참 고생했다. 아래는 처음에 접근한 방식. 입력으로 문자열 2개가 주어지는데 이를 n1, n2라고했다. n1의 첫번째 문자를 잡고 n2를 처음부터 순회한다. n2에 일치하는 문자가 있다면 정지하고 n1의 두번째 문자를 잡고 n2를 정지한 부분에서 부터 시작한다. 이 방식으로 n2도 똑같이 진행한다. 위에서 생각한 방식으로 구현한 소스코드. 2중 for문을 사용했다..
2021.01.28 -
[알고리즘/자바] 백준 4811 - 알약
4811번: 알약 입력은 최대 1000개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄이며, 병에 들어있는 약의 개수 N ≤ 30 가 주어진다. 입력의 마지막 줄에는 0이 하나 주어진다. www.acmicpc.net DP를 활용해야된다고 해서 계속 수식만 만들려다 시간을 많이 잡아먹었다. 코드를 짜보고나서 더 깊게 생각하는것도 나쁘지 않은 방법. 너무 수식만드는데 얽매이지 말아야겠다. 알약이 1개인 경우는 WH (1개) 알약이 2개인 경우는 WHWH , WWHH (2개) 위에서 알수 있듯이 H는 W보다 먼저 많이 나올수 없다. 알약이 2개일떄 WHHW 같은 것은 불가능하다. (병속에 H가 하나도 없는데 H를 또 뽑는건 말이 안된다. ) 따라서 이 문제에서는 병속에 남은 W와 H의 수를 기억..
2021.01.21 -
[알고리즘/자바] 백준 1699번 - 제곱수의 합
1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다 www.acmicpc.net 풀고나면 별거 아닌것 같은데 정답까지 생각이 도달하는데 시간이 꽤 걸렸다. ( 입력이 10 일때 ) dp[10]을 구하기 위해서 이전에 구한 dp[1] ~ dp[9]를 활용할 수 있는 방향으로 머리를 굴렸다. dp[i] = i를 구하기 위한 최소 항 갯수로 dp를 셋팅하고 아래 처럼 모두 적었다. 위에 작성한 부분을 잘보면 dp[10]을 구하기 위해선 아래와 같은 방법을 사용할 수 있다. 이를 코드로 구현하면 아래와 같다...
2021.01.18