일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 타입스크립트
- APOLLO
- 릿코드
- pytorch
- 알고리즘
- C
- 연결 리스트
- 자바스크립트
- 스택
- 연결리스트
- 웹팩
- alexnet
- 프론트엔드
- 이진탐색
- 프로세스
- 배열
- 포인터
- 컨테이너
- cors
- RT scheduling
- GraphQL
- 브라우저
- 코딩테스트
- 큐
- RxJS
- 자료구조
- vue3
- Machine Learning
- 프로그래머스
- 해시테이블
- Today
- Total
목록자료구조, 알고리즘 (48)
프린세스 다이어리
1. 큐란 무엇인가 큐(queue)는 뒤쪽으로 들어가서 앞쪽으로 나오는 자료 구조다. 스케줄링, 탐색 알고리즘 등에서 다방면으로 활용된다. 큐는 크게 데이터를 넣는 push, 데이터를 빼내는 pop 함수로 이루어진다. 스택과 마찬가지로 배열을 이용한 구현 방법과 연결 리스트를 이용한 구현 방법으로 나누어진다. push(7) -> push(5) -> push(4) -> pop() -> push(6) -> pop() 2. 큐를 배열로 구현하기 #include #define SIZE 10000 #define INF 99999999 int queue[SIZE]; int front = 0; int rear = 0; void push(int data) { if (rear >= SIZE) { printf("큐 오버플..
function solution(progresses, speeds) { let answer = []; let workDays = progresses.map((work, i) => Math.ceil((100 - work) / speeds[i])) let prodDay = 0; for (let i = 0; i < workDays.length; i++) { if (prodDay < workDays[i]) { answer.push(1); prodDay = workDays[i]; } else { let temp = answer.pop(); answer.push(++temp); } } return answer; } 진도 95 90 99 99 80 99 속도 1 1 1 1 1 1 소요기간(일) 5 10 1 1 20 ..
1. 중위 표기법과 후위 표기법 뜻 중위 표기법이란, 일반적으로 사람이 수식을 표기할 때 사용하는 표기 방법이다. 흔히 우리는 두 개의 피연산자가 있고 한 개의 연산자가 있을 때, 피연산자 사이에 연산자가 들어갈 수 있도록 표기를 한다. 그러나 컴퓨터가 좋아하는 방식은 후위 표기법이다. 후위 표기법은 연산자가 뒤쪽에 위치한다. 중위 표기법: 7 * 9 + 2 후위 표기법: 7 9 * 2 + 2. 기본적인 구조체와 push, pop 함수 만들기 #include #include #include // 문자열을 처리할 거기 때문에 typedef struct Node{ char data[100]; // 하나의 문자열을 담을 수 있도록. 숫자 또는 연산자 등 다양한 형태가 들어가기 떄문에. struct Node *..
1. 연결 리스트 구조체 만들기 #include #include #define INF 99999999 typedef struct Node{ int data; struct Node *next; } Node; typedef struct Stack{ Node *top; } Stack; 먼저 INF를 무한대의 값으로 설정하고, Node 구조체를 만든다. 기본적으로 연결 리스트는 다음 노드를 가리켜야 하므로, 노드의 data와 다음 노드를 가리키는 포인터 변수 next를 만들어준다. 또 Stack이라는 구조체를 만들어서, 모든 스택이 top이라는 노드를 가지고 있고 포인터를 가지고 있는 구조체이기 때문에 일종의 배열 형태로 만들 수 있다. Top은 스택의 최상단이다. 스택은 데이터를 넣을 때 반드시 top의 자리..
1. 스택(Stack)의 개념 스택은 한쪽으로 들어가서, 동일한쪽으로 나오는 자료구조다. 스택에 한쪽 방향으로 데이터를 넣는 Push와 스택에서 한 쪽 방향으로 데이터를 빼내는 Pop으로 이루어져 있다. 일반적으로 스택은 리스트처럼 생겼기 때문에 배열을 이용한 구현 방법과 연결 리스트를 이용한 구현 방법으로 나뉜다. Push(7) -> Push(8) -> Push(4) -> Pop() -> Push(2) -> Pop() 위 함수를 차례로 실행하면 다음 그림과 같다. 2. 배열을 이용한 스택 구현 #include #define SIZE 10000 #define INF 99999999 int stack[SIZE]; int top = -1; 먼저 전체 스택의 크기 SIZE를 10000으로 정해주고, INF에 ..
1. 양방향 연결 리스트란 양방향 연결 리스트는 각 노드가 머리(Head)와 꼬리(Tail)를 모두 가지는 특징이 있다. 양방향 연결 리스트의 각 노드는 앞 노드와 뒤 노드의 정보를 모두 저장하고 있다. 다음 그림을 보면 앞 노드는 prev, 뒤 노드는 next로 지칭하고 있다. 양방향 연결 리스트를 이용하면 단방향과 달리 리스트의 앞에서부터 혹은 뒤에서부터 모두 접근할 수 있다. typedef struct Node{ int data; struct Node *prev; struct Node *next; } Node; Node *head, *tail; 2. 연결 리스트 노드 삽입 과정 데이터를 오름차순으로 저장하는 양방향 연결 리스트를 구현해 보자. 노드를 삽입할 때는, 앞쪽 노드의 next가 삽입할 노드..
1. 연결 리스트의 장점 일반적으로 배열을 사용하여 데이터를 순차적으로 저장하고, 나열할 수 있다. 하지만 배열을 사용하는 경우, 메모리 공간이 불필요하게 낭비될 수 있다. 연결 리스트를 활용하여 이를 개선할 수 있다. 다음은 연결 리스트가 아닌, 일반적인 배열을 사용하여 특정 원소를 배열의 첫자리에 추가하는 소스다. #include #define INF 10000 int arr[INF]; int count = 0; void addBack(int data) { arr[count] = data; count++; } void addFirst(int data) { for (int i = count; i >= 1; i--) { arr[i] = arr[i - 1]; } arr[0] = data; count++; ..
1. 자료구조가 왜 필요할까? 프로그래머라면 누구나 데이터를 효과적으로 저장하고, 처리하는 방법에 대해서 바르게 이해할 필요가 있다. 그런데 자료구조를 제대로 이해하지 못하면 불필요하게 메모리와 성능을 낭비할 여지가 있다. 예를 들어 프로그램 내에서 INT형 데이터가 100만 개 가량 사용된다고 가정했을 때, 원하는 데이터를 가장 빠르게 찾도록 하는 자료구조는 무엇 일지에 대한 고민을 하면서 프로그램을 짜야한다. 이를 위한 다양한 방법을 제시하는 것이 자료구조이며 가장 효율적인 방법이 무엇인지 알 수 있으려면 자료구조를 알아야 한다. 기본적인 자료구조들은 다음과 같다. (1) 선형 구조 - 배열, 연결 리스트, 스택, 큐 등 (2) 비선형 구조 - 트리, 그래프 등 자료구조와 알고리즘의 상관관계 효율적인..