본문 바로가기

개발새발 개발자/자료 구조

(37)
[Java로 배우는 자료구조] 1-2. 메서드 호출과 프로그램의 기능적 분할 두 정수 a와 b를 받아 a의 b 제곱을 구하는 코드를 짜보자. 여기서 b는 음이 아니어야 한다. 당연히 0은 된다. 이번 장은 메소드가 주제이므로 b 제곱을 계산해주는 함수를 따로 만들어볼 것이다. import java.util.Scanner; public class Code16 { public static void main(String[] args) { Scanner kb = new Scanner(System.in); int a = kb.nextInt(); int b = kb.nextInt(); // 지수는 영어로 power라고 부르므로 power라고 지어봄. int result = power(a, b); System.out.println(result); kb.close(); } // 함수가 받는 파..
[Java로 배우는 자료구조] 1-1. 변수, 배열, 반복문 이 자료는 부경대학교 권오흠 교수의 'Java로 배우는 자료구조론' 수업 PPT입니다. 시간 날 때마다 틈틈히 복습하기 위해 블로그에 업로드 하는 것이며, 저작권은 권오흠 교수님께 있습니다. 출처: http://alg.pknu.ac.kr/t/2016-2017-java/342 강의 가이드. 나는 2강까지는 그냥 읽어보기만 하고 본격적인 영상 강의는 3강부터 들을 예정이다. 메인 함수와 출력에 대한 기본 설명 클래스 이름은 대문자로 구성되는 것이 관습이다. main 메소드가 왜 저렇게 생겼는지는 일단 넘어가도록 하자. 변수는 메서드 내부, 외부 다 가능하지만 클래스 외부에는 선언될 수 없다. 타입은 C와 거의 유사하다. 뭘 import 해야할지 모르겠다면 source > OrganizeImports를 실행해..
[자료구조] 14-3. 넓이 우선 탐색 알고리즘의 응용 (2) 저번 시간엔 한 버텍스에서 시작해 다른 모든 버텍스로 가는 최단 경로 알고리즘을 배웠다. 이번엔 모든 버텍스들에 대한 최단 거리를 찾는 법을 알아본다. 즉, 이 문제는 모든 버텍스의 쌍인 u와 v 사이의 최단 거리를 찾는 문제다. 사실 이것은 하나의 출발점에서 모든 버텍스까지의 최단거리를 확장한 문제라고 생각할 수 있다. 모든 버텍스에 대해 dijkstra's 알고리즘을 돌리면 되지 않을까? 그럴 수도 있겠지만, 새로운 알고리즘을 floyd 라는 사람이 제안했다. 그리고 이후에 여러 번 개선되면서 floyd-warshall 알고리즘과 같이 다양한 이름이 붙여졌다. 이 문제는 주어진 그래프에 대한 인접 행렬을 입력으로 받는다. 왼쪽 그래프가 있다면 오른쪽과 같은 인접 행렬을 받는 것이다. 예를 들어 인접 ..
[자료구조] 14-2. 넓이 우선 탐색 알고리즘의 응용 (1) bfs로 그래프의 거리를 측정하는 문제를 살펴보자. 맨 처음 살펴볼 문제는 '단일 출발점 최단 거리 찾기'이다. 하나의 출발점에서 시작해 다른 모든 버텍스로 가는 최단 거리를 찾는 문제다. 만약 버텍스 v0에서 버텍스 u까지 가는 경로를 v0, v1, v2...vk, u라고 한다면, 패스는 (v0, v1), (v1, v2)...(vk-1, vk), (vk. u)와 같은 엣지들의 집합이다. 이 경로의 cost는 엣지에 있는 가중치의 합으로 생각할 수 있다. 이러한 가중치 그래프가 있다고 할 때, A와 B 버텍스 사이에 가중치가 2라면, 그 사이에 버텍스를 하나 추가한다. B와 E 사이의 가중치는 3이므로 2개를 추가할 수 있다. 가중치가 w인 엣지에 대해 w-1개의 버텍스를 추가하면 동일한 거리를 가지며,..
[자료구조] 14-1. 넓이 우선 탐색 알고리즘 BFS를 얘기하기 전에 먼저 전체적인 체계를 다시 한 번 살펴보자. 그래프에 대한 연산 중 가장 많이 사용되는 것은 DFS와 BFS이다. 지금까지는 DFS에 대해 공부했고, 그와 관련된 연결 성분, 신장 트리, 이중 연결 성분 등에 대해 공부했다. 이번에는 BFS를 배우고 여기에 영향을 받은 최단 거리 구하는 알고리즘에 대해 알아보도록 하자. 그래프에서의 탐색 문제는 서치 또는 트래버셜이라고 부르며, 한 버텍스 v부터 시작해 모든 버텍스를 방문하는 방법을 알아내는 것이다. 탐색을 하는 과정에서 중요한 요소는,1. 한 번 탐색은 노드는 기록한다. 그래야 두 번 다시 방문하지 않을 것이기 때문이다. visit 배열이 추가적으로 필요하다.2. 버텍스를 방문하는 순서를 기억한다. 이를 위한 자료구조로 스택이나 ..
[자료구조] 13-3. 깊이 우선 탐색 알고리즘의 응용 (2) 이중 연결 성분을 찾는 알고리즘은 크게 3단계로 나뉜다. 1. 분절점 정의1) dfn 정의2) back edge 정의3) 분절점 정의2. 분절점 찾기3. 분절점을 이용해 그래프를 이중 연결 성분으로 분해하기 dfn은 depth-first number의 약자이며, dfs를 하면서 버텍스를 방문하는 순서를 의미한다. 만약 위의 그래프에서 3번부터 dfs를 한다고 생각해보자. 버텍스 3에서 갈 수 있는 곳은 1 4 5가 있는데, 숫자가 낮은 것부터 방문하므로 1-2-4-0의 순서로 방문할 것이다. 그럼 dfn은 버텍스 3부터 1-2-4-0까지 0, 1, 2, 3, 4로 부여된다. 맨 마지막에 3번으로 다시 돌아오면 5-6-7-8-9를 방문할 것이다. 이 순서대로 또 5, 6, 7, 8, 9번 dfn이 부여된다..
[자료구조] 13-2. 깊이 우선 탐색 알고리즘의 응용 (1) STL을 이용해 그래프를 구현하는 방법에 대해 복습해보자. 1. 버텍스와 엣지의 수를 입력받는다.2. 각각을 엣지 리스트에 넣는다.3. 정렬한다. 4. 그래프를 만들고 나면 dfs를 구현하기 위해 버텍스의 모든 비지트를 false로 초기화시킨다. 이 함수를 initVisit()라고 한다.5. 모든 버텍스들에 대해 visit가 false라면(아직 방문하지 않았다면) 그 버텍스에 대해 dfs를 수행하라고 명령한다. 6. 해당 버텍스를 처리할 dfs 함수로 들어온다.7. 몇 번 버텍스를 방문하고 있는지 출력한다.8. 버텍스의 visit를 true로 바꿔준다.9. 해당 버텍스에 연결된 모든 버텍스에 대해서, 아직 방문하지 않은 버텍스가 있다면 dfs를 수행한다. 이처럼 코드는 간단하지만 그만큼 이해가 쉽지 않고..
[자료구조] 13-1. 깊이 우선 탐색 알고리즘 깊이 우선 탐색은 연결 성분을 찾으면서 신장 트리를 찾고, 이중/강한 연결 성분도 찾을 수 있기 때문에 중요하다. 그래프에서의 탐색 문제는 버텍스들의 집합에 속한 특정 버텍스 v로부터 시작해, 다른 모든 버텍스를 방문하는 방법에 대해 다룬다. - 가장 중요한 부분은 이미 방문한 노드는 기록해놓고 다시 방문하지 않도록 하는 것이다. 따라서 visit를 저장하는 배열을 추가적으로 사용한다.- 어떤 순서로 방문할지 기억하기 위해 스택이나 큐를 사용한다. 스택은 깊이 우선 탐색, 큐는 넓이 우선 탐색으로 다룬다. 깊이 우선 탐색을 DFS라고 부른다. 어떤 버텍스에 대해 수행하려면 dfs(v) 라는 함수를 사용한다. 버텍스에 연결된 버텍스는 w라고 부른다. if(visit(w)=0) 만약 아직 특정 w에 방문하지..