본문 바로가기
Python/Python Data Structure and Algorithm

[자료구조 with Python] 2. 알고리즘이란.

by Rosmary 2020. 12. 12.
728x90
반응형

 

 

 

 

 

1. 알고리즘(Algorithm)이란 무엇인가

 

알고리즘. 요즘에는 유투브 덕에 이 말을 많이 듣는다. "유투브 알고리즘이 나를 이곳으로 이끌었다". 그래서 이 알고리즘이라는 단어가 컴퓨터의 등장 이후 발생한 단어라고 알고 계신 분들이 많을 듯 하다. 하지만, 의외로 이 알고리즘은 최초의 컴퓨터가 탄생하기 이전에도 존재했던 단어이고, 지금도 우리의 일상에서도 물론이거니와 기원전의 생활에서도 얼마든지 볼 수 있다. 

 

알고리즘은 어떤 일을 함에 있어서 "일을 효율적으로 처리하기 위한 절차"라고 생각하면 된다. 예를 들어, 라면을 하나 끓인다고 가정해보자. 라면 끓이는 방법이야 사람마다 제각각이고 개인의 경우에도 자기 기분에 따라 면을 먼저 넣는 날이 있을 것이고 스프를 먼저 넣는 날이 있을 것이다(가장 중요한 것은 물을 끓이는 것이 선행되어야 한다는 것이지만). 그러나 자신이 가장 맛있게 라면을 끓이는 방법은 아주 공고하게 정해져 있을 것이다. 필자의 경우를 예로 들어보자. 

 

1. 라면과 라면을 끓일 냄비를 준비한다.

2. 물 350mL 정도를 냄비에 넣고 강불에 끓인다.

3. 물이 끓는 동안 파 끝단 3cm정도를 잘게 썰어놓는다. 

4.. 물이 끓으면 스프와 파를 넣는다.

5. 물이 다시 펄펄 끓으면 면을 넣는다. 

6. 면이 익으면 젓가락으로 건져 올려 공기 중에 5초 정도 식힌 뒤 다시 넣는다. X 5

7. 계란을 풀어넣고 면과 저어준 다음, 불을 끈다.

8. 치즈라면이 먹고 싶다면 치즈를 넣어 먹는다.

 

위에 기술한 내용은, 필자가 라면을 가장 맛있게 끓일 수 있는 효율적인 절차, 즉 라면을 끓이는 알고리즘이다(물을 끓이기 전에 냄비에 라면을 넣고, 끓인 물을 넣는 방법도 있겠지만, 누가보아도 라면을 만드는 효율적인 절차와는 거리가 멀다). 음식 조리 외에도 목적지까지 길을 찾아가는 것이라던가, 조금 더 스케일을 키운다면 전쟁 시 작전을 수립하는 것 역시 일종의 알고리즘이라고 보면 된다. 

 

프로그래밍의 알고리즘 역시 마찬가지다. 어떠한 목적으로 프로그램을 만들었는데, 이 프로그램이 효율적으로 목적을 달성할 수 있도록 그 절차를 기술한 것이 알고리즘이다. 

 

 

 

2. 알고리즘의 기술

 

일상 생활에서의 알고리즘, 즉 특정 절차의 기술 방식은 여러가지가 될 수 있다. 위에서 든 예시처럼 1, 2, 3 등의 번호로 순차적으로 기술할 수도 있고, 그림이나 표 등으로도 기술할 수 있다. 하지만 컴퓨터 분야의 알고리즘은 화살표와 도형을 이용한 기술을 사용한다. 대략 아래와 같은 모양인데, 고등학교 1학년 수학 교과서에 나왔던 내용(필자는 7차 교육과정을 받았다. 지금과는 조금 다를 수 있다)과 동일하다.

 

 

라면 끓이는 법은 필자가 순서도를 그리기 매우 귀찮으니, 일상 생활의 다른 알고리즘으로 순서도를 작성하며 기호를 설명해볼까 한다. 필자는 일주일에 로또 두 게임을 꾸준히 산다. 그리고 필자는 로또 1등이 당첨되면 로또 사기를 그만할 것이라고 가정해보자. 

 

1. 로또를 사기로 결심한다.

2. 로또를 구매할 현금 2000원 이상이 있는지 확인한다.

   - 없을 경우 ATM에 가서 10000원을 뽑느다.

   - 있을 경우 로또 구매점으로 간다.

3. 로또 2게임을 산다.
4. 당첨일까지 기다린다.

5. 당첨일에 당첨 여부를 확인한다.

   - 당첨되었을 경우, 기뻐하며 로또 사기를 그만둔다. 응?

   - 당첨되지 않을 경우, 1로 돌아간다. 

이를 표현하면 아래의 그림과 같이 나타낼 수 있다.

 

 

(1) 단말 기호

 

단말 기호는 직사각형 모퉁이가 둥글게 말린 형태이다. 알고리즘 순서도에서는 이 기호가 단 두 번 나오는데, 순서도의 시작점, 그리고 종료점에서 나타난다. 필자는 로또 사기 순서도에 필자의 강력한 소망을 적어넣었지만, 일반적으로 이 기호 안에는 START나 END와 같이 매우 단순한 문구가 들어간다. 프로그래밍에서도 START, END를 쓰는 경우가 있지만 덜 단순하게 표시하자면 이 기호 안에는 어떠한 프로세스를 처리하는 함수명이 시작지점에 들어가는 경우도 있다.

 

 

(2) 준비

준비 기호는 보통 순서도의 시작 기호 다음에 오는 기호로, 절차 시작 전에 필요한 변수 선언과 초기화를 진행하는 단계이다. 사실 필자가 그린 로또 사기 순서도에서 현금만 초기화를 했는데, 제대로 하려면 days도 선언과 초기화를 진행해주어야한다. 

 

 

(3) 처리

 

그리기 편해서 좋네..^^


처리 기호는 직사각형으로 생긴, 그리기 매우 편한 기호이다. 이 기호는 어떠한 처리 행위를 기술하는 기호라 보면 된다. 프로그래밍에서는 연산의 실행, 또는데이터의 처리 과정을 나타내는 기호다. 


(4) 판단

 

판단은 어떠한 처리 행위 이후 나타난 결과값, 또는 알고리즘 시작 시 입력한 변수값 등에 대해 조건을 만족하는지 판단하고, 조건 만족 여부에 따라 다음 진행사항을 분기시키는 기호라고 보면 된다. 프로그래밍에서는 이 기호가 while 또는 If-else 문에 사용되는데, 이 때문에 알고리즘 기호 중 유일하게 다음 과정으로 나아가는 화살표를 두 개 이상 갖는 기호이다.

 

 

(5) 루프

 

 

루프는 규칙적으로 변하는 변수값과 함께 처리해야 할 작업이 있는 경우 사용하는 기호이다. 특이하게도 기호가 두 개인데, 위쪽 뚜껑(?)에는 변동되는 변수값의 초기값, 마지막값과 증가값이 입력되어 있고, 아래 뚜껑으로 마무리되는 형태이다. 프로그래밍의 for 문 사용 시, 기술하는 기호이며, 이 두 뚜껑 사이에는 처리 기호와 함께 처리할 수 있는 내용을 기술한다.

 

 

(6) 데이터 입출력

 

 

데이터 입출력 기호는 판단 기호와 비슷하지만, 아랫변과 윗변이 가로 90도로 놓여진 마름모꼴 형태의 기호다. 이 기호는 데이터의 입출력, 그러니까 키보드로 어떤 값을 입력받거나, 화면에 내용을 출력하는 절차를 기술한다. python에서 input과 print 계열의 코드가 이 기호에 속한다.

 

 

(7) 프린트

 

 

프린트 기호는 어떠한 내용을 문서 상으로 출력하는 것을 기술하는 기호다. 위의 데이터 입출력 기호도 출력과 관련된 내용이 있으나, 화면에 출력하느냐, 아니면 실제 문서로 출력하느냐의 차이가 존재한다. 별 것은 아니지만 헷갈릴 수 있는 부분이니 유의하도록 하자.

 

 

(8) 흐름선

 

마지막으로 소개할 기호는 흐름선이다. 흐름선은 필자가 그린 알고리즘 순서도에서 화살표로 표시되는 기호인데, 알고리즘의 각 절차들의 순서를 표시한다. 

 

 

 

3. 자료구조와 알고리즘 순서도.

 

 

그런데, 자료구조에 대해 설명하는 포스팅에 뜬금없이 알고리즘 순서도를 설명하는 것에 대해 궁금하신 분들이 있을 것이다. 대학교의 컴퓨터 공학과에서 보통 알고리즘과 자료구조는 별개의 과목으로 수업이 개설되는 경우가 많기 때문에 컴퓨터 공학과의 커리큘럼을 한 번이라도 관심을 가지고 보셨던 비전공자 분들이라면 이 둘이 큰 상관관계를 가지고 있지 않다고 생각하는 분들도 있을 것이다. 

 

자료 구조는 프로그램을 효율적으로 제작하기 위한 데이터 구조 및 데이터의 처리 방법에 대해 다루는 과목이다. 그리고 이 처리방법을 기술하는 도구가 바로 알고리즘 순서도이다. 특정 형식의 프로그램을 작성함에 있어서 효율적인 방법의 데이터 구조가 작동하는 방식을 직관적으로 확인할 수 있다면 학습에 도움이 크게 되는데, 이 때문에 알고리즘이 무엇인지, 알고리즘의 순서도가 의미하는 것이 무엇인지 알고 있다면 크게 도움이 된다. 조금 더 나아가, 알고리즘 순서도를 알고 있다면, 특정 목적을 가지는 프로그램 제작 시, 프로그램이 동작하는 여러 경우의 수를 순서도로 나타내고, 이들 순서도를 비교함으로써 조금 더 단순하면서도 효율적인 순서도를 참조하여 코딩을 진행할 수 있다. 

 

 


 

이번 포스팅에서는 알고리즘의 의미가 무엇인지, 그리고 알고리즘을 기술하기 위한 순서도에서 사용하는 기호가 어떤 의미를 가지는지에 대해 간략히 알아보았다. 다음 포스팅부터 Python의 자료구조에 대해 본격적으로 글을 작성해보려 한다.

 

 

 

Fin. 

반응형

댓글