본문 바로가기

Computer Science

(45)
[Algorithm] 벨만-포드 알고리즘(Bellman-Ford Algorithm) 벨만 포드 알고리즘은 다익스트라 알고리즘과 다르게 음수 가중치가 있는 그래프에서도 모든 정점으로 가는 최단 거리를 찾을 수 있게 해줍니다. 하나의 출발점에서 출발하여 모든 지점으로 가는 최단 거리를 알 수 있습니다. 1. 벨만 포드 알고리즘 기본 아이디어는 그래프를 연결하고 있는 Edge를 기준으로 모든 정점으로 가는 최단 거리를 찾는 것입니다. 다익스트라가 정점 중심으로 최단 경로를 찾았다면 벨만 포드 알고리즘에서는 Edge들을 중심으로 찾습니다. 정점의 갯수를 V라 할 때, 한 정점에서 모든 정점을 방문할 수 있으려면 적어도 V-1번 방문해야 모든 정점을 방문할 수 있습니다. 따라서 모든 Edge들을 V-1번 보면서 각 정점의 최단 거리를 찾습니다. 다만 주의할 점은 만약 처음 D->C로가는 가중치 ..
[Algorithm] 다익스트라 알고리즘 (Dijkstra algorithm) 다익스트라 알고리즘은 최단경로를 탐색하는 알고리즘이며, 2차원 배열을 이용하여 구현시 O(N^2)의 시간복잡도를 가지고 힙(Heap)을 이용하여 구현하면 O(ElogN) 시간안에 탐색할 수 있는 알고리즘입니다. 다익스트라 알고리즘은 한 지점(S)에서 목적지 지점(E)로 이동할 수 있는 최단 경로를 탐색할 수 있으므로 단일 출발, 단일 도착 최단경로 문제에 활용될 수 있습니다. 단, 음수 가중치를 가지는 그래프에서는 사용할 수 없다는게 단점입니다. 왜 그런지는 잠시 뒤에 알아보겠습니다. 1. 다익스트라 알고리즘 시작점 S 에서 출발해 연결되어 있는 간선을 모두 방문한 뒤 해당 노드에 있는 값(경로 값, 초기 값은 무한대)보다 작으면 갱신시켜 줍니다. 그 다음 연결되어 있는 Edge 중에서 현재 가중치와 더..
[Algorithm] 최소 공통 조상 LCA (Lowest Common Ancestor) 최소 공통 조상이란? 최소 공통 조상(LCA)란 두 노드가 트리에서 두 노드를 포함하여 조상을 따라 거슬러 올라갈때 처음 공통으로 만나게 되는 정점이다. 아래 그림에서 5와 8의 LCA 는 바로 1이다. 그럼 어떻게 임의의 두 노드에 대해서 처음으로 같이 만나는 조상을 찾을 수 있을까? 처음으로 생각해 볼 수 있는 방법은 서로 만날 때까지 부모 노드를 따라서 두 노드를 옮겨 보는 것이다. 두 노드의 높이가 다르다면 높이를 맞춰주고 나서 하나씩 올려본다면 트리의 깊이를 H 라했을 때 찾는데 O(H)가 되고 최악의 경우 O(N) 의 시간을 가지게 된다. 더 빠르고 효율적으로 하는 방법은 없을까? DP 배열을 이용해서 O(logN) 시간에 구할 수 있다. 만약 두 노드의 15번째 조상이 서로 다르다면 1,2,..
[Algorithm] 인덱스 트리(Indexed Tree) 구간 합을 구하는 트리의 종류로 인덱스 트리, 세그먼트 트리, 펜윅 트리가 있다. 세그먼트 트리는 인덱스 트리가 포함하고 있는 한 종류이다. 세그먼트 트리로 풀 수 있는 문제는 인덱스 트리로 모두 풀 수 있다. 인덱스 트리란 ? 이진 트리의 한 종류로서 구간 합을 구하는데 쓰이는 자료구조. 예를 들어, 배열 A에 수열이 들어있고 구간 S-E 가 주어졌을때 ① A[S] - A[E] 의 구간합을 구하고 ② 구한 뒤 특정 A[i]번째 원소가 다른 숫자로 바뀐다. ①② 번 작업을 반복하는 일이 있을 때 인덱스 트리를 쓰게 된다. 만약 1,2,3,4 라는 수열이 배열에 들어있다고 하면 수의 갯수를 모두 리프노드에 넣을 수 있을만큼의 배열을 잡아야한다. 아래 그림에서 4,5,6,7 번에 1,2,3,4 가 들어가면 ..
[OS] 페이지 부재(page fault)와 가상기억장치의 원리 1. 가상기억장치의 필요성 가상기억장치가 있는 이유가 뭘까? 잠시 운영체제가 메모리를 어떻게 할당하는지 알아볼 필요가 있다. 운영체제는 여러 프로그램이 동시에 수행되는 시분할(time sharing) 환경에서 한정된 메모리 공간을 여러 프로그램이 조금씩 나누어 사용한다. 이 과정에서 운영체제는 모든 프로그램들에게 똑같은 메모리 크기를 할당하는 것보다는 몇몇 프로그램들에게 집중적으로 메모리를 할당하고 프로그램 수행 후 메모리를 회수하여 다른 프로그램들에게 할당하는 방식을 사용한다. 이유는 ①빠른 프로세스의 수행 ②프로그램마다 최소한 확보해야하는 메모리의 크기가 존재하기 때문이다. 프로그램이 실행되기 전에 그 프로세스의 주소 공간 전체가 메모리에 올라와 있어야 하는 것은 아니다. 따라서, 운영체제는 CPU ..
[Spring] AOP 패러다임 1. AOP AOP는 흔히 '관점 지향 프로그래밍'이라는 용어로 번역되는데, 이때 '관점(Aspect)'이라는 용어가 너무 어렵습니다. 개발자들에게 '관점'이란 용어는 관심사(Concern)이라고 번역이 되는데 개발 시 필요한 고민이나 염두에 두어야 하는 일이라고 생각할 수 있습니다. 1. 파라미터가 올바르게 들어왔을까? 2. 이 작업을 하는 사용자가 적절한 권한을 가진 사용자인가? 3. 이 작업에서 발생할 수 있는 모든 예외는 어떻게 처리해야 하는가? 등이 있을 수 있습니다. 핵심 로직은 아니더라도 전통적으로 개발자가 개발하면서 반복적으로 이러한 문제를 코드에 담아내게 됩니다. 하지만 AOP는 좀 다른 방식으로 접근합니다. '관심사의 분리(seperate concerns)'입니다. AOP 는 개발자가 ..
[Spring] Mysql / MyBatis insert 쿼리 수행하면서 PK 가져오기 Spring 에서 Mysql을 사용할 때 데이터를 insert 함과 동시에 Auto Increment 로 증가하는 PK값을 받아오고 싶었다. PK 는 유일했기 때문에 데이터를 insert 한 후에 select문을 실행해서 가져온다고 하더라도 정확한 데이터 값을 가져올 수 없었다. parameterType 을 본인이 사용하는 DataClass로 지정하고, insert 속성중 하나인 useGeneratedKeys 를 true 로 바꾼다 (기본값 = "false") : 자동생성키그리고 keyProperty를 DB에 Auto Increment 가 지정되어 있는 Column 명으로 지정하면 사용하는 DataClass 필드에 자동으로 저장된다.
[Spring] Spring project log4j 충돌 현상 Log4j 2 를 설치하고 나서 @Log4j 를 썼을 때 오류가 났다... 갑자기 난 오류라 많이 당황해서 여러 검색도 해봤지만 정말 힘들게 찾아서 해결했다. log4j 1.2 xx 버전은 더 이상 사용하지 않는 버전이라고 한다. 그래서 pom.xml 페이지에 있는 dependency의 scope를 provided 로 바꿔주자 해결되었다. 참고링크 : http://logging.apache.org/log4j/2.x/faq.html#which_jars