전체 글

창의의 개발블로그입니다.
· Spring
관점 지향 프로그래밍이란? 관점 지향 프로그래밍 (Aspect Oriented Programming)는 기존의 OOP로는 해결할 수 없는 횡단 관심사에 대해서 재사용 가능한 코드로 만들기 위해서 등장했다. 기존의 OOP로 웹 애플리케이션은 다음과 같이 프레젠테이션 계층, 서비스 계층, 데이터 액세스 계층으로 나눠 관심사를 분리했다. 이를 통해서 유지보수와 테스트를 유용하게 만들었다. 프레젠테이션 계층과 관련된 변경은 프레젠테이션 계층에서 구현된 코드에 국한되도록 코드를 구성했기 때문에 변경 점을 찾기 쉬웠고 서비스 계층과 데이터 액세스 계층도 마찬가지였다. 관심사의 분리를 통한 계층화는 성공적이었다. 하지만 이런 관심사의 분리를 이용할 수 없는 관심사들이 생겼다. 예를 들면 트랜잭션에 대한 관심사는 서비..
템플릿 메소드 패턴이란? 상속을 통해 부모클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법이다. 변하지 않는 기능은 부모 클래스에 만들어두고 자주 변경되고 확장이 필요한 기능은 자식 클래스에서 만들도록한다. 예제 다음과 같이 클래스 A가 존재한다고 할 때 부가 기능 혹은 확장이 필요한 코드에 대해서 템플릿 메소드 패턴을 사용해서 묶어낼 수 있다. public class A{ public void execute(){ // 부가 또는 확장이 가능한 코드 //... // 핵심 기능 //... } } 부모 클래스에서는 미리 추상 메소드 또는 protecte (재정의가 가능하도록) 메소드를 정의하고 이를 이용해 주요 기능을 담당하는 템플릿 메소드를 만든다. public abstract class A{ // ..
· OOP
개방 폐쇄 원칙이란 개방 폐쇄 원칙이란 클래스나 모듈은 확장에는 열려있어 쉽게 확장이 가능해야하고 변경에는 닫혀있어 자신이 의존하고 있는 클래스나 모듈의 변화에도 자신은 변경되지 않는다는 원칙이다. 예시 이를 코드로 살펴보면 다음과 같다. public class A{ private B b; public A(B b){ this.b = b; } public void execute(){ b.execute(); // 핵심 기능 } } 위의 클래스 A는 B에 의존하고 있지만 b가 변경된다고 하더라도 B인터페이스를 통해 execute를 실행하고 있기 때문에 A에는 변경이 일어나지 않는다. public inteface B{ public void execute(); } B 인터페이스를 상속하고 있는 구현체라면 A는 b..
· 백준
1253번: 좋다 문제 주어진 수 배열에 대해서 배열의 값 X가 다른 배열의 두 값의 합으로 나타낼 수 있다면 “좋다”라고 표현한다. 주어진 배열에 대해서 좋은 수는 몇개인지 출력하시오. 풀이 주어진 값들을 정렬한다면 대상 값의 앞에 까지만 합을 계산해봐도 해당 값이 합으로 나타낼 수 있는지 알 수 있다. 따라서 먼저 수들을 정렬하고 배열의 첫번째 부터 대상 값의 바로 앞 까지의 값을 투포인터로 비교하면 된다. start값과 end값의 합을 구하고 대상 값보다 작다면 start값을 높이고 크다면 end 값을 낮춘다. 만약 대상 값과 같다면 다음 값을 대상으로 반복한다. 유의해야할 부분은 같은 값이 배열에 존재할 수 있다. import java.io.BufferedReader; import java.io...
· 백준
2018번: 수들의 합 5 문제 주어진 수에 대해서 연속된 자연수의 합으로 나타낼 수 있는 경우의 수를 출력하라. 풀이 주어진 수가 15일 때, 경우의 수는 다음과 같다. 1+2+3+4+5, 4+5+6, 7+8, 15 모든 수들은 자기 자신을 가지고 시작한다. 투포인터를 사용하면 쉽게 풀 수 있다. 두개의 포인터 i, j가 있을 때 i, j를 1부터 시작하여 두 점의 구간의 합을 구해나간다. 만약 구간의 합이 주어진 수 N보다 작다면 j를 높이고 주어진 수보다 크다면 i를 빼면서 올라간다. 만약 주어진 값과 같다면 i와 j 모두 움직인다. 즉, 다음과 같이 움직인다. 1 + 2 = 3 (3 < N) 1 + 2 + 3 = 6 (6 < N) 1 + 2 + 3 + 4 = 10 (10 < N) 1 + 2 + 3..
· 백준
1940번: 주몽 문제 주어진 값들 중에서 2개를 뽑아서 더해 M값이 되는 경우의 수를 모두 구해라 풀이 배열을 정렬해서 작은 값과 큰 값을 움직이는 start와 end값을 이동시켜 해답을 찾아간다. 1.start와 end값의 합이 M보다 크다면 end값을 낮춘다. 2.start와 end값의 합이 M보다 작다면 start값을 높인다. 3.만약 M과 같다면 start와 end를 동시에 이동한다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Main { publ..
· 백준
10986번: 나머지 합 문제 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하시오. 풀이 이 문제는 나머지 연산은 묶어낼 수 있다는 점을 사용해야 한다. 합배열을 M으로 나눈 나머지 값을 계산한 배열을 계산한다. 여기서 나머지가 0이라는 의미는 주어진 배열 A[0] ~ A[i] 구간의 합이 M으로 나누어 떨어진다는 의미이다. 나머지 배열이 같은 값을 가지고 있다면 C[i] - C[j]는 0이 된다. 이 수식은 다음과 같이 볼 수 있다. 합 배열 S[i] - S[j]는 A[j] ~ A[i]구간의 합 배열이고 이 구간의 합 배열은 S[i] %M - S[j] % M = 0이 된다는 의미이다. 나머지 연산은 언제 계산하든지 상관 없기 때문에 나머지 연산 배열 C에서 같은 값을 꺼내 빼준다면 ..
· 백준
11660번: 구간 합 구하기 5 첫째 줄에 표의 크기 N과 합을 구해야 하는 횟수 M이 주어진다. (1 ≤ N ≤ 1024, 1 ≤ M ≤ 100,000) 둘째 줄부터 N개의 줄에는 표에 채워져 있는 수가 1행부터 차례대로 주어진다. 다음 M개의 줄에는 네 www.acmicpc.net 문제 1차원 배열이 아닌 2차원 배열의 구간합을 구하는 문제이다. 풀이 단순히 2차원 배열로 확장한 것이 아니라 일정 4각형 범위의 구간합을 구하라는 문제이다. 다음과 같은 구간이 있다면 구간합 배열은 다음과 같다. 기존의 배열 A와 합배열 S가 있다면 다음과 같이 계산된다. S[x][y] = S[x-1][y] + S[x][y-1] + A[x][y] - S[x-1][y-1] 이를 그림으로 나타내보면 다음과 같다. S[2]..
창e
창의