이론 20

자료구조 트리에 대해서 배워보자

📚 트리의 정의 트리는 뿌리와 가지로 구성되어 거꾸로 세워놓은 나무처럼 보이는 계층형 비선형 자료 구조이다. 트리는 대표적인 사용 예시는 컴퓨터의 폴더 구조이다. 파일이 어느 경로에 있는지 그 경로에는 어떤 폴더들이 포함되는지 나타내야 하기 때문이다. 트리의 구조는 다음과 같다 🧬 트리의 구조 Node : 트리에서 데이터를 저장하는 기본 요소 Root Node : 트리 맨 위에 있는 노드 Level : 최상위 노드를 Level 0으로 하였을 때, 하위 Branch로 연결된 노드의 깊이를 나타냄 Parent Node : 어떤 노드의 상위 레벨에 연결된 노드 Child Node : 어떤 노드의 하위 레벨에 연결된 노드 Leaf Node(Terminal Node) : Child Node가 하나도 없는 노드 S..

이론/자료구조 2021.09.06

[자료구조] 해시(Hash)란 무엇인가

오늘은 보안에서 가장 자주 사용되는 해시함수의 근본인 자료구조 해시를 배워보겠다 📚 해시 테이블이란 컴퓨팅에서 키를 값에 매핑할 수 있는 구조인, 연관 배열 추가에 사용되는 자료 구조이다. 해시 테이블은 해시 함수를 사용하여 색인(index)을 버킷(bucket)이나 슬롯(slot)의 배열로 계산한다. 데이터를 다루는 기법 중에 하나로 데이터의 검색과 저장이 아주 빠르게 진행된다. 💡 해시 테이블의 원리 해시 테이블은 파이썬의 딕셔너리(dictionary)와 같다 menu = {"apple": 1000, "potato": 500, "melon": 9000, "iceCream": 1500} 해시 테이블은 자료의 접근이 O(1)이다 menu에서 melon의 가격을 찾고 싶다면 menu의 인덱스를 모두 찾지 ..

이론/자료구조 2021.09.03

프로토콜, HTTP와 HTTPS, SSL

목차 1. 프로토콜 2. HTTP 3. HTTPS 4. SSL의 원리 1. 프로토콜 더보기 우리 인간은 인터넷을 통해 서로 필요한 데이터를 수신하고 또 다른 사람들에게 데이터를 송신한다. 그런데 데이터를 주고받을 때 송신한 사람들 자기편한대로 데이터를 보내면 어떻게 될까? 그럼 받는 사람이 이 데이터는 어떤 형식의 데이터이고 데이터가 주고자 하는 메시지는 무엇인지 당연히 모른다. 그래서 우리는 세계적으로 데이터를 주고받는 양식을 일종의 규칙으로 만든 것이 바로 프로토콜이다. 세상 모든 사람들이 한 양식에 맞춰서 데이터를 보내면 나는 지구 반대편에 사람이 올린 블로그 글도 쉽게 볼 수 있는 것이다. 2. HTTP 더보기 프로토콜의 계층은 물리, 링크, 네트워크, 전송, 세션, 표현, 응용으로 이렇게 7 계..

이론/보안 2021.09.02

[암호학] 대칭키와 비대칭키란 무엇인가

📖 개요 우리는 실생활에서 애플리케이션이나 웹을 통해 자신의 정보와 수많은 데이터들을 다른 서버들과 송수신을 합니다. 하지만 송수신하는 과정에서 누군가가 내 데이터를 도청하거나 위변조를 한다면 대단히 위험해질 것입니다. 그래서 우리는 제 3자가 도청하더라도 무슨 데이터인지 모르게 하기 위해 평문을 암호화해서 암호문으로 바꿔야 하며, 목적지에 도착하면 보내준 데이터를 읽을 수 있도록 암호문을 복호화해서 다시 평문으로 바꿔줘야 합니다. 📖 암호 알고리즘의 종류 암호 알고리즘은 크게 단방향 암호화와 양방향 암호화가 있다. 🔑 단방향 암호화 단방향 암호화는 평문을 암호문으로 암호화하는 것은 가능하지만 암호문을 평문으로 복호화하는 것은 불가능한 암호화 기법입니다. 이렇게 원래의 데이터로 복구가 불가능한 단방향 암..

이론/보안 2021.08.31

[자료구조] 스택,큐

1. 스택 더보기 스택은 데이터가 아래에서부터 쌓이고 데이터를 꺼내려면 위에서부터 빼야 하는 LIFO(Last In First Out) 구조를 가지는 자료구조입니다. 흔히 쟁반 쌓기, 빨래통에 비유가 되는 이 스택 자료구조는 파워포인트나 word 또는 다양한 프로그램의 되돌리기(ctrl + z), 다시 하기(ctrl + y) 에 쓰입니다 ctrl + z 사용하면 가장 먼저 실행한 명령보다 가장 최근에 실행한 명령을 취소해야 하니까요. 이외에도 많은 부분에 쓰이는 자료구조라서 반드시 배워야 합니다. 스택이라는 자료 구조에서 구현해야할 기능은 다음과 같습니다. push(data) : 맨 앞에 데이터 넣기 pop() : 맨 앞의 데이터를 뽑으면서 그것을 반환해주기 peek() : 맨 앞의 데이터 보기 isEm..

이론/자료구조 2021.08.26

[알고리즘] 버블정렬, 선택정렬, 삽입정렬

1. 버블 정렬 더보기 버블 정렬은 보시다시피 두 개씩 비교해서 정렬한다는 모양이 마치 거품과도 같다해서 버블 정렬이라고 부릅니다. 맨 왼쪽에서부터 두 가지 수를 비교해서 오른쪽 수가 적으면 서로 자리를 바꾸고 오른쪽 수가 크면 자리를 바꾸지 않는 것입니다. 저 빨간색 네모가 왼쪽에서 맨 오른쪽까지 도착하게 되면 한 번 순회했다고 부르는데 한 번 순회할 때마다 맨 오른쪽에 하나씩 정렬이 됩니다. 왜냐하면 제일 큰 수는 저 빨간색 네모에서 계속 자리를 바꿔 결국에는 맨 뒤로 향하기 때문입니다. 그래서 한 번 순회하면 ~~, 8 두 번 순회하면 ~~7, 8 여섯 번 순회하면 1, 2, 3, 6, 7, 8 이런 식으로 정렬이 됩니다. 이러한 동작을 코드로 구현하면 다음과 같습니다. input = [3, 6, ..

이론/알고리즘 2021.08.25

[알고리즘] 재귀함수

재귀 함수는 함수 안에 자기를 다시 호출하는 함수이다. 알고리즘 문제 중 어떤 패턴이 반복적으로 나오거나, 같은 문제를 여러 번 풀어야 하는 상황이 생길 때 쓰이는 방법이다. 재귀 함수를 만드는 방법은 간단하다. def infinity: print("재귀함수가 뭐냐면은...") infinity() 함수 안에 다시 자신의 함수를 호출하면 된다. 근데 위의 예시는 계속 자신의 함수를 무한정 호출하게 되므로 스택오버플로우 오류가 일어난다. def function(k): if k

이론/알고리즘 2021.08.21

[알고리즘] 이진탐색 시간복잡도

이런 배열이 있고 나는 'mango'라는 단어가 이 배열에 있는지 탐색한다고 가정하자 배열에 어느 특정 값을 찾으려면 당연히 처음부터 끝까지 하나씩 하나씩 찾아봐야 한다. 마치 배열 요소 닫힌 박스라고 생각하고 거기서 망고가 들어있는 박스를 찾으려면 하나하나씩 일일이 다 열어봐야 한다. 우린 이렇게 처음부터 순차적으로 데이터를 찾아보는 것을 순차 탐색이라 부른다. 여기서 운이 좋게도 한 번에 그 박스를 찾으면 행복하겠지만 맨 마지막에 그 박스를 찾으면 나는 운이 더럽게도 없다며 생각할 것이다. 여기서 순차 탐색의 시간복잡도를 알 수 있다. 찾고자 하는 데이터가 배열의 맨 앞에 있다면 시간 복잡도는 O(1)이지만 맨 뒤에 있었다면 시간복잡도는 O(N)이 걸릴 것이다. 즉 배열의 크기가 클수록 더 많은 시간..

이론/알고리즘 2021.08.21

[알고리즘] Array와 LinkedList 분석해보기

자료구조 중에서 자주 쓰이는 Array와 LInkedList를 서로 비교하겠다. 언어는 Python 기준으로 하겠다. (선언할 때 배열 크기를 정해야 하는 c++, 자바의 정적 배열과는 달리 Python의 배열은 동적 배열이다.) 다음 간단한 배열의 예를 들어보자 배열은 index와 데이터로 이루어져있다. index는 0으로부터 시작되어 데이터의 순서를 매기며 데이터는 int형부터 시작되어 그 어떤 데이터 타입도 들어갈 수 있다. 여기서 배열의 어떤 하나의 데이터에 접근하는데 걸리는 시간은 얼마나 소요될까? 정확히 말하자면 시간복잡도 O는 얼마일까? 답은 O(1)이다. 내가 접근하고 싶은 데이터가 배열의 맨 앞에 있는 뒤에 있든 중간에 있는 ary[0], ary[2], ary[4] 이런 식으로 단 한 번..

이론/자료구조 2021.08.18

[알고리즘] 시간복잡도, 공간복잡도, 점근표기식

1. 시간복잡도 더보기 시간 복잡도는 입력값에 따라 문제를 해결하는데 걸리는 시간과의 상관관계를 말합니다. 똑같은 알고리즘에 입력값이 몇 배로 늘어남에 따라 문제를 해결하는 데 걸리는 시간은 몇 배만큼 늘어나는지 보는 것이다. 우리는 똑같은 입력값이라도 당연히 더 빠른 시간 안에 입력을 처리하는 알고리즘을 선호한다. 즉 걸리는 시간이 줄어들수록 시간 복잡도는 작아지며, 시간 복잡도가 작은 알고리즘이 좋은 알고리즘이다. 시간 복잡도에 대해서 설명하기 위해 똑같은 목적을 가진 두 개의 알고리즘을 살펴보겠다. 두 개의 알고리즘의 목표는 배열 안에 숫자 중 가장 큰 최댓값을 찾는 로직이다. array = [1,3,6,5,4,2] def findMaxValue(array): max_num = array[0] fo..

이론/알고리즘 2021.08.15