본문 바로가기

Programming/알고리즘

(23)
[자료구조] 트리, 그래프 트리와 그래프 (그래프 ⊃ 트리 로도 볼 수 있음) 공통점 노드와 노드 간을 연결하는 간선으로 구성된 자료구조 차이점 트리 그래프 모델 계층 모델 네트워크 모델 방향 방향 무방향, 방향, 양방향 순환 비순환 순환, 비순환, 자기순환 간선 수 노드 수 - 1 자유 기타 루트 노드, 부모-자식 노드 개념 有 트리 구성 요소 및 용어 Node (노드) : 트리를 구성하는 각각의 요소 Edge (간선) : 노드와 노드를 연결하는 선 Root Node (루트 노드) : 트리 구조 최상위에 있는 노드 Parent Node (부모 노드) : 자식 노드를 가진 노드 Chlid Node (자식 노드) : 부모 노드를 가진 노드 Sibling Node (형제 노드) : 같은 부모를 가지는 노드 Terminal Node (..
DFS, BFS 참고: 더보기 https://developer-mac.tistory.com/64 https://better-tomorrow.tistory.com/entry/DFS-BFS-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0 DFS, BFS 시간복잡도 인접 리스트 : O(접점 + 간선) 인접 행렬 : O(접점^2) DFS (Depth First Search) : 깊이 우선 탐색 정의 노드들이 포함된 브랜치 하나를 완벽하게 탐색 후 다른 브랜치 탐색 과정 1. 탐색 시작 노드를 스택에 삽입, visited 처리 2. 스택의 top 노드에 인접 & visited 처리되지 않은 노드를 스택에 삽입, visited 처리 3. 모든 인접 노드가 visited 처리됐을 시 스택의 top 노드를 꺼냄 (2..
DP(Dynamic Programming, 동적 계획법) DP 정의 크고 복잡한 문제를 여러 개의 부분 문제로 나누어 푸는 방법 => 부분 문제들 풀고 값 저장, 해당 문제 다시 만날 때 재연산하지 않고 저장해둔 값 불러옴 조건 1. 부분 반복 문제 부분 문제가 여러 번 재사용되는 경우 (=진행했던 연산이 반복되는 경우) 2. 최적 부분 구조 부분 문제에서 구한 최적의 값을 이용해(합산해) 큰 문제의 최적의 값을 구함 특징 메모이제이션(Memoization) : 메모리에 부분 문제 값 저장해나감 → 연산 반복될 시 저장해둔 값 사용 => 주로 배열 사용해 값 저장 구현 방법 (예시 - 피보나치 수열) 가장 작은 문제(base case) & 점화식 구한 후, Bottom-up 또는 Top-down 방식으로 구현하기 1. Bottom-up 방식 : 반복문을 통해 ..
[자료구조] 선형 구조 - 스택(Stack), 큐(Queue), 덱(Deque) 스택 입출력이 한 방향에서만 발생하는 구조 출력 시 가장 최근 입력값(top에 위치)을 꺼냄 (FILO, First-in-last-out) ex) 갑(곽) 휴지 시간복잡도(O) 삽입, 삭제(pop) 시 top 값만 추가, 삭제하면 됨 (추가 연산 없음) => O(1) 특정 값 삭제, 검색 시 위에서부터 순차적으로 탐색해야 함 => O(N) Stack 클래스 메소드 push() : top에 데이터 추가 pop() : top 데이터 삭제 peek() : top 데이터 조회 empty() : 스택 비어있을 때 true, 아니면 false 출력 search() : 데이터 위치 조회 (1부터 시작) 장단점 장점 : top을 통한 데이터 접근, 삽입, 삭제 용이 단점 : 크기 고정 후에야 사용 가능 (=> 배열 대..
[백준/자바] 브루트포스 7568번 - 덩치 문제 우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩치가 각각 (x, y), (p, q)라고 할 때 x > p 그리고 y > q 이라면 우리는 A의 덩치가 B의 덩치보다 "더 크다"고 말한다. 예를 들어 어떤 A, B 두 사람의 덩치가 각각 (56, 177), (45, 165) 라고 한다면 A의 덩치가 B보다 큰 셈이 된다. 그런데 서로 다른 덩치끼리 크기를 정할 수 없는 경우도 있다. 예를 들어 두 사람 C와 D의 덩치가 각각 (45, 181), (55, 173)이라면 몸무게는 D가 C보다 더 무겁고, 키는 C가 더 크므로, "덩치"로만 볼..
[백준/자바] 브루트포스 2798번 - 블랙잭 문제 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블랙잭은 카지노마다 다양한 규정이 있다. 한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다. 김정인 버전의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다. 그런 후에 딜러는 숫자 M을 크게 외친다. 이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다. N장의 카드에 써져 있는 숫자가 주어졌을 때, ..
[백준/자바] 재귀 24060번 - 병합정렬 문제 N개의 서로 다른 양의 정수가 저장된 배열 A가 있다. 병합 정렬로 배열 A를 오름차순 정렬할 경우 배열 A에 K 번째 저장되는 수를 구해서 우리 서준이를 도와주자. 크기가 N인 배열에 대한 병합 정렬 의사 코드는 다음과 같다. merge_sort(A[p..r]) { # A[p..r]을 오름차순 정렬한다. if (p < r) then { q
재귀 알고리즘 재귀 함수 참고 링크 더보기 https://blog.encrypted.gg/943?category=773649 [실전 알고리즘] 0x0B강 - 재귀 안녕하세요, 재귀 파트를 시작하겠습니다. 지금 자신있게 말할 수 있는게 있는데 이 파트가 정말 어려울 것입니다. 물론 이전의 내용들 중에서도 군데군데 어려운게 있었겠지만 이번 단원에서 blog.encrypted.gg https://imjeongwoo.tistory.com/17 [알고리즘] 재귀(Recursion)와 수학적 귀납법(Mathematical Induction) 재귀(Recursion) void func1(int n) { if (n == 0) return; cout imjeongwoo.tistory.com : 종료 조건(base condition, ..
[백준/자바] 10870번 피보나치 수열 문제 피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다. n=17일때 까지 피보나치 수를 써보면 다음과 같다. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597 n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오. 코드 재귀함수로 피보나치 수열의 숫자를 구하는 문제이다. 먼저 0번째 숫자는 0, 1번째 숫자는 1인 종료 조건을 선언했다. 피보나치 수열은 앞 두 수의 합으로 이뤄지므로 각 루프마다 재귀함수 파라미터 변수의 앞 두 숫자인..
[백준/자바] 25305번 커트라인 - Arrays.sort 문제 2022 연세대학교 미래캠퍼스 슬기로운 코딩생활에 N명의 학생들이 응시했다. 이들 중 점수가 가장 높은 k명은 상을 받을 것이다. 이 때, 상을 받는 커트라인이 몇 점인지 구하라. 커트라인이란 상을 받는 사람들 중 점수가 가장 가장 낮은 사람의 점수를 말한다. 코드 앞으로 정렬 문제는 차근차근 종류별로 풀어보려고 한다. 앞서 선택, 삽입, 버블, 카운팅 정렬을 코드로 만들었기에 이번에는 자바에 내재된 java.util.Arrays 클래스를 활용해봤다. (다음 알고리즘 문제에서는 Arrays 클래스가 사용하는 합병정렬을 직접 코드로 작성할 예정이다.) 먼저 StringTokenizer로 공백으로 띄워진 각 데이터들을 정수로 변환해 변수, 배열에 대입했다. 정렬할 때에는 Arra..