SImpAS

Typescript로 자료구조(Data-Structure)직접 구현해보기: :Intro(0) 본문

Algorithm/자료 구조

Typescript로 자료구조(Data-Structure)직접 구현해보기: :Intro(0)

잡다한 것들은 다 해보겠다 simpas 2020. 3. 23. 20:56

0. 도입


안녕하세요! 여러분이 보고 계시는 이 부분은 Typescript로 자료구조(Data-Structure) 직접 구현해보기 시리즈의 도입 문서의 도입 부분입니다! 해당 문서는 프로그래밍에 대해 어느 정도 지식을 갖춘 사람을 대상으로 하고 있습니다. 하지만! 그렇지 않은 사람들을 위해 해당 시리즈에서 사용할 Typescript에 대해 정리해 놓은 포스팅은 없습니다ㅎㅎ

 

 빠른 시일 내로 추가하도록 하겠습니다! 

 

우선 해당 시리즈를 포스팅하기에 앞서,  저 또한 알고리즘을 공부하면서 정리를 하기 위해 블로그에 포스팅하는 학생입니다.  포스팅 내용중에 미흡한 부분이나, 더 나아질 수 있는 부분이 있을 수 있으니, 해당 부분에 대해 댓글로 알려주시면 감사하겠습니다!

 

알고리즘을 공부하기 위해 여기저기 찾아보면, 자료구조라는 것이 세트로 묶여서 검색 결과에 나옵니다. 이 포스팅의 도입 부분에선 알고리즘, 알고리즘과 세트메뉴인 자료구조, 그리고 왜 자료구조가 세트메뉴로 묶여서 검색되는지에 대해 알아보겠습니다.

0. 1 알고리즘이란?

알고리즘의 매우 기본적인 정의는 다음과 같습니다.


어떠한 문제를 해결하기 위한 여러 동작들의 모임이다. 유한성을 가지며, 언젠가는 끝나야 하는 속성을 가지고 있다. 수학과 컴퓨터 과학에서 알고리즘이란 작동이 일어나게 하는 내재하는 단계적 집합이다. 알고리즘은 연산, 데이터 진행 또는 자동화된 추론을 수행한다.

 

출처:https://opentutorials.org/course/2471/13912


뭔가 되게 어렵게 느껴지는 이 알고리즘에 대한 정의를 풀어서 설명하자면, 컴퓨터 과학에서의  알고리즘이란 작동이 일어나게 하는 내재하는 단계적 집합이고, 연산, 데이터 진행 또는 자동화된 추론을 수행한다 고 할 수 있습니다.

...?

 

네, 뭔가 되게 어렵게 느껴지는 저 정의는 아주 잘 풀어서 설명했다고 생각합니다. 다만 저 정의가 어렵게 느껴지는 것은 단어가 생소해서 그렇습니다.

 

연산을 수행한다 = 숫자들을 가지고 계산한다. 덧셈, 뺄셈, 나눗셈(연산 종류를 여기까지 밖에 모르는 거 아님!)등등의 숫자와 연산의 조합을 일련의 절차를 거쳐서 결과를 도출해내는 것이죠. 그리고 이렇게  결과를 도출해내는 과정을 알고리즘이라고 합니다.

 

예를 들어, 1 + 1 + 2는 다음과 같은 절차로 계산이 됩니다.

 

1이 있다.

무언가를 더한다.

그 무언가는 1이다. -> 2

또 무언가를 더한다.

그 또다른 무언가는 2다. -> 4

결과는 4다.

(마치 한편의 시 같았다..)

 

위와 같은 것을 곧, 알고리즘이라 부릅니다.

마찬가지로 데이터 진행에 대해 예를 들어보면 다음과 같습니다.

게임 프로그램을 하나 만들었다고 생각해봅시다. 텍스트 기반의 게임으로, 상황에 따라 다양한 선택지가 나온다고 해봅시다.


게임

아침이 밝았다, 무슨 일을 가장 먼저 하겠는가?

1. 양치 ( -> 단단한 치아 획득! )

2. 식사 ( -> 굉장한 에너지 획득! )

3. 다시 잔다 ( -> 굉장한 에너지와 칭호: '백수' 획득! )


여기서  다시 잔다   를 선택하고 게임을 진행하려 하는데, 단단한 치아를 획득하게 된다면, 이 게임을 플레이하는 유저들은 게임의 개연성에 실망을 금치 못하며 혀를 찰 겁니다.

 

이렇게 사용자가  어떤 선택을 했느냐에 따라서 제공되는 데이터가 적절하게 진행되도록 하는 것  이 바로 알고리즘입니다.

 

이제 마지막으로 자동화된 추론에 대해 알아보고 다음:> 왜 알고리즘을 공부하지?로 넘어가도록 하겠습니다.

자동화 추론은 통계와 연결 지어 생각하면 이해하기 편합니다. 우선 자동화 추론의 예를 들어보겠습니다.

 

여러분 대부분  유튜브를  이용할 겁니다. 그리고 유튜브에서 다양한 동영상을 시청하고 나면, 어느샌가 맞춤 동영상은 취향에 맞는 동영상들로 가득 차였는 걸 볼 수 있습니다. 바로 이것이 자동화 추론입니다.

 

여러분이 어떤 동영상을 봤는지, 어떤 종류의 동영상을 좋아하고, 어느 정도 길이의 영상을 자주 봤는지와 같은 다양한 통계자료를 기반으로 추론을 거친 뒤, 추천 동영상을 제공해주기까지, 이 모든 과정이 모두 자동화 추론을 수행하는 알고리즘이라고 볼 수 있습니다.

 

여기까지 알고리즘에 대해 어느정도 알아보았습니다. 다음으로 알고리즘의 필요성에 대해 알아봅시다.

0. 2 왜 알고리즘을 공부하지?

우선 알고리즘의 필요성을 정량적으로 알기 위해서는 시간복잡도, 공간복잡도라는 개념이 필요합니다. 하지만 해당 문서는 가벼운 도입문서이기 때문에 시간 복잡도와 공간 복잡도에 대해 깊게 다루지는 않을 겁니다. 더욱 깊은 내용은 다음 포스팅을 참고해주세요. (아직 안 씀ㅎㅎ)

 

정량적인 부분에 대해 대충 설명을 하자면,  좋은 알고리즘  은  좋지 않은 알고리즘 에 비해 더 빠르게 맡은 기능을 수행할 수 있고, 더욱 적은 자원을 활용해서 맡은 기능을 수행할 수 있습니다.

 

결국, 더 빠르고, 더 효율적인 알고리즘을 통해 서비스의 품질을 향상하는 것 알고리즘을 공부하는 이유라고 할 수 있습니다. 앞서 예로 든 연산을 한번 살펴봅시다.

여러분 모두 1 + 1은 쉽게 계산해냅니다. 저희 모두 덧셈은 아주 기본적인 연산으로 이해하고 있지만, 다들 초﹒ 중고등학교 때 이런 소리를 들어본 적 있죠


'1 + 1 = 2' 임을 증명하는 내용은 A4용지에 11pt로 가득 채울 수 있다.


만약 1 + 1을 계산하기 위한 알고리즘이 덧셈을 기본적인 연산으로 이해하지 못하고 있다면...?

1 + 1을 계산해내는 프로그램을 만들기 위해 11pt A4용지에 꽉 채울 내용을 알고리즘으로 구현해야 하고 덧셈을 기본적인 연산으로 이해하고 있는 알고리즘보다 계산속도가 느릴 수밖에 없죠.

 

설명이 굉장히 극단적이긴 했지만, 실제로 서비스의 규모가 커지고 처리해야 할 데이터의 양이 많아진다면, 프로그램 수행 시간의 차이가 서비스의 품질을 정해주죠.

 

공간 복잡도 또한, 방대한 양의 데이터를 다루게 되면 중요성이 증가합니다.

우선 프로그램 안에서 데이터를 저장하고 사용하기 위해서는 메모리에 데이터를 저장할 공간이 필요합니다. 하지만 메모리에 한 번에 올라갈 수 없을 정도의 데이터라면,  프로그램이 실행되지 않고 멈추게 됩니다.  이 때문에 방대한 양의 데이터일수록, 나눠서 데이터를 처리하는 게 보통이고, 이를 효율적으로 나누기 위해서는 좋은 알고리즘이 필요한 거죠. 여기서 이렇게 또 한 번 알고리즘의 중요성이 부각되게 되죠.


이번엔 알고리즘이 무엇이고, 필요한지에 대해서 간단하게 알아보는 시간을 가졌습니다. 다음 0.3절, 0.4절에서는 자료구조가 무엇인지, 자료구조가 왜 알고리즘을 공부하는데 필요한지에 대해서 알아보는 시간을 가지도록 하겠습니다.

0 Comments
댓글쓰기 폼