반응형
힙(Heap)이란 ? 완전 이진 트리의 일종으로, 데이터에서 최댓값과 최솟값을 빠르게 찾기 위해 만들어진 자료구조입니다. 힙을 사용하는 이유는 최댓값과 최솟값을 찾기 위해 배열을 사용하는 경우 O(n)의 시간복잡도가 걸리는 반면, 힙을 사용하면 O(logn)의 시간복잡도가 소요되므로 시간적으로 효율적이기 때문입니다. 완전 이진 트리 (Complete Binary Tree)란 ? 이진 트리에 노드를 삽입할 때 왼쪽부터 차례대로 삽입하는 트리로 아래 그림과 같습니다. 만약, 왼쪽이 비어 있고 오른쪽이 채워져있다면 완전 이진 트리라고 할 수 없습니다. 힙의 특징 힙은 최대 힙과 최소 힙으로 나눠집니다. 최대 힙(max heap) : 부모 노드의 값이 자식 노드이 값보다 크거나 같은 완전 이진 트리. ( 부모 ..
문제 설명 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조대 : 119 박준영 : 97 674 223 지영석 : 11 9552 4421 전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요. 제한 사항 phone_book의 길이는 1 이상 1,000,000 이하입니다. 각 전화번호의 길이는 1 이상 20 이하입니다. 같은 전화번호가 중복해서 들어있지 않습니다. 입출력 예제 ph..
Binary Search(이진 탐색/이분 탐색) 이진 탐색 알고리즘은 정렬되어 있는 배열에서 찾고자 하는 특정한 값을 찾아내는 알고리즘입니다. 이진 탐색 알고리즘이 탐색하는 방식은 배열의 중간에 있는 값(mid)을 선택하여 찾고자하는 값(x)과 비교합니다. 찾고자하는 값(x)가 중간 값(mid)보다 작으면 중간 값을 기준으로 왼쪽으로 다시 탐색, 크다면 오른쪽으로 다시 탐색합니다. 다시 탐색을 시작할 때 찾고자하는 값(x)가 중간 값(mid)보다 작으면 해당 중간 값부터 우측 끝값을 제거하고 다시 중간 값을 선택하고 찾고자하는 값(x)을 찾습니다. 반대로 찾고자하는 값(x)가 중간 값(mid)보다 크면 해당 중간 값부터 좌측 끝값을 제거 하고 다시 중간 값을 선택하고 찾고자하는 값(x)를 찾습니다. 찾고..
완전탐색 완전탐색이란 이름 그대로 모든 것을 탐색 즉, "모든 경우의 수를 다 만들어 보는 방법"입니다. 만약 휴대폰 비밀번호 4자리의 핀 번호를 까먹어서 0000 ~ 9999 까지 모든 수를 도전 해본다면, 최대 10000번의 도전이 있을 것입니다. 이 처럼 완전 탐색은 무식하게 모든 경우의 수를 전부 탐색하기 때문에 시간 복잡도가 매우 커서 입력값의 크기가 작을 때 사용하기 좋습니다. 완전탐색 알고리즘 1. Brute Force 단순한 반복문(for)과 조건문(if)으로 모든 경우의 수를 만들어 답을 구하는 방법입니다. 아주 기초적인 문제에 주로 나옵니다. 2. Bitmask (비트마스크) 2진수를 이용하는 컴퓨터의 연산을 이용하는 방식 나올 수 있는 모든 경우의 수가 "각각의 원소가 포함되거나, 포..
Greedy(탐욕) 알고리즘이란 ? Greedy를 번역하면 "탐욕스러운"이라는 뜻을 가집니다. 그리디 알고리즘은 탐욕이란 뜻처럼 현재 상황에서 최적의 해만을 선택합니다. 그리디는 현재 상황의 최적의 해를 구하는다는 것에 중점을 두어야하는데, 그 이유는 다음 그림을 봅시다. 가장 큰수를 찾기 위해 앞으로 간다면 제일 큰 수가 있는 "1000"과 연결되어 있는 100 -> 1000 을 생각할 것입니다. 하지만 Greedy 알고리즘은 시작부터 두 수중 가장 큰 수인 "500"을 탐색하고 그 다음 큰 수인 "200"을 탐색합니다. 이 처럼 그리드는 최종결과에서의 최적의 해가 아닌 "현재상황에서 최적의 해"를 구합니다. 그리디 알고리즘 적용 조건 1. 탐욕스러운 선택 조건 앞의 선택이 이후의 선택에 영향을 주지 ..
문제 설명 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다. 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다. 예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다. 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 ..