본문 바로가기

전체 글103

백준 1932번 정수삼각형 JAVA DP문제이다. 이전 층에 있던 삼각형의 합을 메모라이제이션 해서 원하는 층에서 그 저장해 놨던 값을 재사용 함으로서 연산의 회수를 줄인다. Bottom up 방식으로 풀었다. 만약 DP를 사용하지 않고 완전탐색으로 푼다면, 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 위와 같은 정수 삼각형이 있다고 가정을 하면, 각 층마다 조합으로 한가지를 선택하는 것이기 때문에 1C1 * 2C1 * 3C1 * 4C1 * 5C1로 결론적으로 5!의 시간복잡도가 나타나게 된다. 층수를 입력범위중 최대인 500이면 500!의 시간복잡도가 나타나기 때문에 불가능하다. 따라서, 또 다른 정수 합의 저장을 위한 리스트를 만들고 7 10 15 18 16 15 20 25 20 19 24 30 27 26 24 와 같이 층을 .. 2020. 11. 18.
동빈북 7장 내용정리 이진탐색(Binary Search) 이진탐색은 영어로는 Binary Search이다. 일반적으로 탐색할 때는 순서대로 탐색하는 순차 탐색 말그대로 순서대로 탐색하는 것이다. 그러나 이 방식은 찾는 데이터가 자료구조의 가장 끝부분에 들어가 있다면 이상황이 최악의 탐색상황이므로 O(N)의 시간 복잡도를 나타낸다. 이제 이거를 어떻게 효율적으로 탐색할 수 있는지에 대한 아이디어에서 나온것이 바로 이분탐색(이진탐색,Binary Search)이다. 만약 배열의 요소가 int[] list = {1,5,7,10,11,14,17,20,64,100}; 라고 가정해보자. 만약에 찾고자 하는 key값이 100이라면 순차탐색을 하게되면 접근하는 요소의 순서가 1,5,7,10,11,14,17,20,64,100 순서로 총 10번을 방문하게 된다.(key값이 없더라.. 2020. 11. 13.
동빈북 6장 개념정리 정렬(Sort) 정렬의 사전적 의미는 말그대로 요소를 순서대로 놓는것이다. 예를들어 2,5,10,9,8 이라는 숫자들이 나열되어 있을때, 2, 5, 8, 9, 10 등으로 말이다. 정렬에는 굉장히 여러가지 종류가 있는데, 삽입정렬, 선택정렬, 버블정렬, 퀵정렬, 힙정렬, 합병정렬 등 여러가지가 있다. 이 정렬들이 어떻게 구현되어 있고(어떤 방법을 이용하여 정렬했는지) 시간복잡도가 얼마나 되며 왜 그런 복잡도를 가지는지를 아는 것은 매우 중요하다. (사실 나도 삽입 정렬이랑 선택 정렬은 아직도 햇갈린다.) 그래서 정리를 하려고 한다. 선택정렬 저장된 데이터의 요소 중 최소값을(또는 최대 값) 찾고 데이터의 요소 중 첫번째와 뒤집는 방식이다. 삽입정렬 저장된 데이터의 요소를 하나씩 찾아서 올바른 위치에 삽입 해준다. 즉, .. 2020. 11. 13.
동빈북 5장 내용 정리 DFS/BFS DFS/BFS는 결국 그래프를 탐색하는 방법이다. 그래프는 아래 그림처럼 노드와 간선으로 이루어 진다. DFS/BFS는 간선으로 연결된 노드를 탐색하는 방법이다. 즉, 인접해 있는 노드를 탐색하는 알고리즘이다. 나타내는 방법은 인접 행렬 방식과 인접리스트 방식이다. 하지만 방문 순서가 다르다. DFS는 트리에 연결된 노드를 쭉 따라서 깊이에 따라서 탐색하는 방식이고 BFS는 이름 그대로 대상 노드에 연결된 모든 노드를 우선 탐색하는 방식이다. DFS는 Stack으로 BFS는 큐로 구현한다. DFS의 경우 재귀함수가 Stack으로 동작하기 때문에 재귀함수를 이용하여 직관적으로 구현할 수 있다. DFS를 응용한 백트래킹이라는 알고리즘도 존재한다. 트리로 동작이 되었다면 트리의 깊이를 따라서 탐색하다가 그 가.. 2020. 11. 13.