정보

알고리즘과 표현

머릿속에 있는 방법은 나만 압니다.
남도, 컴퓨터도 똑같이 따라올 수 있게 밖으로 적어야
비로소 알고리즘이 됩니다.

학습 목표

  1. 알고리즘의 뜻을 설명하고, 어떤 절차가 알고리즘이 되기 위해 갖추어야 할 다섯 가지 조건을 확인할 수 있다.
  2. 같은 알고리즘을 자연어 · 의사코드 · 순서도로 표현하고, 상황에 맞는 표현 방법을 고를 수 있다.
  3. 순차 · 선택 · 반복 세 가지 제어 구조를 구별하고 순서도로 나타낼 수 있다.

머릿속에 있는 방법은 아직 알고리즘이 아니다

밖으로 꺼내 적어야 남도, 컴퓨터도 따라올 수 있습니다.

문제를 풀 방법을 떠올렸다고 해서 문제가 저절로 풀리지는 않습니다. 그 방법이 내 머릿속에만 있으면 나 말고는 아무도 쓸 수 없기 때문입니다. 친구에게 설명하려면 말로 옮겨야 하고, 컴퓨터에게 시키려면 컴퓨터가 읽을 수 있는 형태로 옮겨야 합니다.

알고리즘(algorithm)

문제를 푸는 데 필요한 일을 어떤 차례로 해야 하는지까지 밝혀 적어 놓은 것입니다.

「알고리즘」은 9세기 무렵에 활동한 수학자 알콰리즈미(al-Khwarizmi)의 이름에서 온 말입니다. 그는 계산 문제를 정해진 절차를 따라 푸는 방법을 정리한 사람으로 알려져 있습니다. 말의 뿌리에 이미 「정해진 절차」라는 뜻이 들어 있는 셈입니다.

사실 우리는 알고리즘을 이미 매일 쓰고 있습니다. 조리법, 가구 조립 설명서, 준비 운동 순서가 모두 그렇습니다. 이들의 공통점은 할 일이 순서대로 적혀 있고, 그 순서대로 따라 하면 누구나 같은 결과에 이른다는 것입니다.


알고리즘과 프로그램은 다르다

두 단어를 같은 뜻으로 쓰는 일이 잦지만, 가리키는 대상이 다릅니다.

알고리즘

어느 언어로 적었는지와 상관없는 풀이 방법과 그 차례입니다. 종이에 적어 두어도, 말로 밝혀 설명해도 알고리즘입니다.

프로그램

알고리즘을 프로그래밍 언어(컴퓨터에게 일을 시키려고 만든 언어)로 옮겨 컴퓨터가 실행할 수 있게 만든 것입니다.

그래서 같은 알고리즘을 여러 언어로 옮길 수 있습니다. 방법이 하나여도 그것을 적는 언어는 여럿일 수 있기 때문입니다. 거꾸로, 프로그램으로 옮기지 않고 종이에만 적어 둔 것도 알고리즘입니다.


모든 절차가 알고리즘이 되지는 않는다

「순서대로 적힌 것」이면 무엇이든 알고리즘이라고 부를 수 있을 것 같지만 그렇지 않습니다. 사람은 애매한 지시를 받아도 앞뒤 사정을 보고 알아서 메웁니다. 「소금을 적당히 넣으라」는 말을 듣고도 대충 짐작해 넣습니다. 컴퓨터는 그 빈칸을 메우지 못합니다. 그래서 컴퓨터에게 넘길 만한 절차인지를 구별하는 기준이 따로 마련되어 있습니다.

스스로 확인

오늘 아침에 일어나 집을 나서기까지 한 일을 다섯 단계로 적어 보세요. 그 다섯 단계를 우리 집에 처음 온 사람이 그대로 따라 할 수 있을지 확인해 보세요.

알고리즘이 되기 위한 다섯 가지 조건

하나라도 빠지면 컴퓨터가 따라올 수 없습니다.

집에 있는 동생에게 심부름을 시킨다고 해 봅시다. 나는 곧 나가야 해서 쪽지 한 장만 남길 수 있습니다. 옆에서 「그거 말고 저거」라고 거들어 줄 수 없으니, 동생이 그 쪽지만 보고 끝까지 해낼 수 있게 적어야 합니다.

컴퓨터에게 일을 시키는 것이 딱 이 쪽지와 같습니다. 컴퓨터는 되묻지 않고, 눈치도 보지 않습니다. 그래서 쪽지가 갖추어야 할 것이 그대로 알고리즘이 갖추어야 할 것이 됩니다.

심부름 쪽지를 다시 읽어 보기

  • 적어 놓은 일이 정말 할 수 있는 일인가 — 문 닫은 가게에 다녀오라고 적지는 않았는가
  • 심부름값을 함께 건넸는가 — 돈이 없으면 쪽지대로 해도 살 수가 없다
  • 사 온 것을 어디에 두라고 적었는가 — 어딘가에 두고 가 버리면 내가 찾을 수 없다
  • 「적당히」 같은 말이 섞여 있지 않은가 — 동생이 나와 다르게 읽는 순간 심부름은 어그러진다
  • 언젠가 「이제 끝」이 되는가 — 끝나는 지점이 없으면 동생은 계속 가게를 오간다

이 다섯 가지에는 각각 이름이 붙어 있습니다. 차례대로 수행 가능성 · 입력 · 출력 · 명확성 · 유한성이며, 다섯을 모두 갖추어야 알고리즘이라고 부를 수 있습니다. 각 조건이 무엇을 요구하는지는 그 조건을 어긴 절차를 함께 보면 훨씬 또렷해집니다.

알고리즘의 다섯 가지 조건과 각 조건을 어긴 예
조건 무엇을 요구하는가 이 조건을 어긴 예
수행 가능성
feasibility
모든 단계가 실제로 실행할 수 있는 일이어야 합니다. 「1을 0으로 나눈 값을 구한다」 — 나눗셈 자체를 할 수 없으므로 이 단계에서 멈춥니다.
입력
input
처리에 필요한 데이터가 있으면 밖에서 받아들일 수 있어야 합니다. 받을 것이 없으면 입력은 0개여도 됩니다. 「두 수를 더한다」 — 어떤 두 수인지 받아들일 방법이 어디에도 없습니다.
출력
output
실행을 마치면 적어도 하나의 결과가 밖으로 나와야 합니다. 「걸음 수를 세어 마음속으로만 기억한다」 — 결과가 밖으로 나오지 않아 아무도 확인할 수 없습니다.
명확성
definiteness
누가 읽어도 똑같은 한 가지 행동으로만 풀이되어야 합니다. 「적당히 걷는다」 — 얼마나 걸어야 하는지가 사람마다 다릅니다.
유한성
finiteness
단계를 따라가면 반드시 끝에 닿아야 합니다. 「목표를 채울 때까지 걸음 수를 다시 센다」 — 더 걷지 않으면 세는 일이 영영 끝나지 않습니다.

입력이 하나도 없는 알고리즘도 있습니다

「입력」 조건은 반드시 무언가를 받아야 한다는 뜻이 아닙니다. 「1부터 100까지 더한 값을 출력한다」처럼 밖에서 받을 것이 없는 알고리즘도 있습니다. 이 조건이 막으려는 것은 필요한 데이터가 있는데 받아들일 길이 없는 경우입니다. 반면 출력은 사정이 다릅니다. 결과가 하나도 나오지 않으면 무엇을 위해 실행했는지 알 수 없으므로, 출력은 적어도 하나 있어야 합니다.


다섯 조건은 「좋은가」를 묻지 않는다

다섯 조건은 알고리즘인지 아닌지를 구분하는 기준입니다. 좋은 알고리즘인지를 구분하는 기준이 아닙니다. 다섯 조건을 모두 만족하면서도 쓸데없이 오래 걸리거나 낭비가 큰 절차가 얼마든지 있을 수 있습니다. 지금은 알고리즘이 되는 조건까지만 봅니다.

스스로 확인

「물이 끓을 때까지 기다린다」는 다섯 조건 가운데 어느 것을 위태롭게 할까요? 조건을 만족하도록 한 문장으로 고쳐 써 보세요.

같은 알고리즘, 세 가지 표현

누구에게 보여 줄 것인지에 따라 적는 방법이 달라집니다.

알고리즘을 적는 방법은 하나가 아닙니다. 흔히 쓰는 것만 꼽아도 자연어와 의사코드, 그리고 순서도가 있습니다. 셋은 서로 다른 알고리즘이 아니라 같은 알고리즘을 적는 세 가지 방식입니다. 「가로와 세로를 받아 직사각형의 넓이를 구해 알려 주는」 하나의 알고리즘을 세 가지로 적어 보겠습니다.

자연어(natural language)

한국어 · 영어처럼 사람이 일상에서 쓰는 말로 적는 방법입니다.

  1. 가로 길이를 받는다.
  2. 세로 길이를 받는다.
  3. 가로와 세로를 곱해 넓이를 구한다.
  4. 구한 넓이를 알려 준다.

의사코드(pseudo code)

자연어로 쓴 문장을 프로그래밍 언어와 비슷한 형식으로 배치한 것입니다. 어느 언어로도 실행되지 않는 대신, 특정 언어의 문법에 매이지 않습니다.

알고리즘 시작
    가로 ← 입력받은 값
    세로 ← 입력받은 값
    넓이 ← 가로 × 세로
    넓이를 출력
알고리즘 끝

순서도(flowchart)

약속된 기호와 화살표로 그리는 방법입니다. 흐름이 눈에 그대로 보인다는 것이 가장 큰 장점입니다.

시작 가로, 세로 입력 넓이 ← 가로 × 세로 넓이 출력 끝

세 표현을 나란히 놓고 보면 「가로와 세로를 받아 곱한 뒤 알려 준다」는 뼈대가 셋 다 같다는 것이 보입니다. 달라진 것은 뼈대가 아니라 그 뼈대를 무엇으로 적었는가뿐입니다.


그러면 어느 것으로 적어야 할까

항상 옳은 하나는 없습니다. 알고리즘의 크기와 읽을 사람에 따라 골라야 합니다.

세 가지 표현 방법의 좋은 점과 조심할 점
표현 방법 좋은 점 조심할 점
자연어 따로 배우지 않아도 누구나 읽고 쓸 수 있습니다. 같은 문장을 놓고도 사람마다 다른 그림을 그릴 수 있어 오해가 없도록 더 꼼꼼히 써야 합니다.
의사코드 프로그램으로 옮기기 쉽고, 길어져도 형식이 흐트러지지 않습니다. 프로그래밍 언어의 생김새에 익숙하지 않으면 읽기 어려울 수 있습니다.
순서도 흐름이 나뉘고 되돌아오는 모습이 그림으로 한눈에 보입니다. 단계가 많아지면 그림이 커지고 선이 엉켜 오히려 알아보기 힘들어집니다.

셋 가운데 하나만 골라야 하는 것도 아닙니다. 큰 흐름은 순서도로 그리고 세부 계산은 의사코드로 적는 식으로 함께 쓰는 경우가 많습니다.

스스로 확인

이 알고리즘을 프로그래밍을 한 번도 해 본 적 없는 사람에게 하나만 보여 준다면 셋 중 무엇을 고르겠습니까? 이유를 함께 말해 보세요.

순서도 그리기

모양마다 뜻이 정해져 있어, 모양만 봐도 무슨 일인지 알 수 있습니다.

순서도의 힘은 기호의 모양에 뜻을 실어 둔다는 데서 나옵니다. 글을 읽지 않고 모양만 살펴봐도 「여기서 값을 받고, 저기서 흐름이 나뉘는구나」가 보입니다. 그러려면 정해진 모양을 정해진 뜻으로만 써야 합니다. 내 마음대로 모양을 바꾸면 그림을 읽는 사람이 오히려 헷갈립니다.

순서도에서 쓰는 기호와 그 뜻
모양 이름 언제 쓰는가
시작과 끝 알고리즘이 시작하는 곳과 끝나는 곳에 놓습니다. 하나의 순서도에 시작은 하나입니다.
처리 계산하거나 값을 저장하는 등 실제로 하는 일을 적습니다.
조건 조건을 검사해 흐름을 나눕니다. 보통 나가는 화살표가 둘이며 각각에 「예」와 「아니오」를 적습니다.
입력과 출력 데이터를 밖에서 입력받거나 결과를 밖으로 출력할 때 씁니다.
흐름선 다음에 어느 기호로 가는지를 가리킵니다. 화살표 머리로 방향을 나타냅니다.

읽기 좋은 순서도를 그리는 요령

같은 알고리즘도 그리는 방식에 따라 읽기가 크게 달라집니다. 다음 다섯 가지만 지켜도 충분히 읽을 만해집니다.

  1. 전체 흐름이 위에서 아래로, 나뉠 때는 왼쪽에서 오른쪽으로 가도록 배치합니다.
  2. 기호 안에 무슨 일을 하는지를 짧게 적습니다. 기호 밖에 설명을 늘어놓지 않습니다.
  3. 약속된 기호만 씁니다. 새 모양을 만들어 쓰지 않습니다.
  4. 흐름선이 서로 엇갈리지 않게 합니다. 엇갈리면 어디로 가는 선인지 알 수 없습니다.
  5. 시작과 끝, 그리고 나뉘는 곳과 되돌아오는 곳를 분명히 드러냅니다.

되돌아가는 화살표는 예외입니다

「위에서 아래로」라는 요령과 어긋나 보이지만, 같은 일을 다시 하려고 위쪽으로 되돌아가는 화살표는 순서도에서 정상입니다. 오히려 그 화살표가 있어야 여기서부터 다시 반복한다는 것이 보입니다. 이렇게 되돌아가는 구조를 반복 구조라고 합니다.

스스로 확인

「같은 알고리즘, 세 가지 표현」 절의 직사각형 넓이 순서도에서 평행사변형이 두 번 쓰였습니다. 두 기호가 각각 무슨 일을 하는지 말해 보세요.

흐름을 만드는 세 가지 제어 구조

아무리 복잡한 알고리즘도 이 셋을 엮어 나타낼 수 있습니다.

알고리즘에서 다음에 무엇을 할지 정하는 짜임을 제어 구조(control structure)라고 합니다. 제어 구조에는 순차 구조, 선택 구조, 반복 구조 세 가지가 있습니다. 아무리 긴 알고리즘이라도 이 셋을 엮은 것으로 볼 수 있습니다.

셋의 차이를 보기 위해, 하루 걸음 수를 다루는 상황을 예로 들어 보겠습니다. 하루 목표를 8000보로 정했다고 해 봅시다. 이 목표 값은 설명을 위해 우리가 정한 숫자입니다.

순차 구조

시작부터 끝까지 한 방향으로 차례차례 실행하는 구조입니다. 나뉘지도, 되돌아가지도 않습니다.

시작 오늘 걸음 수 입력 기록장에 저장 끝

선택 구조

조건을 검사해 둘 중 한 쪽 길로만 가는 구조입니다. 어느 쪽으로 가든 다시 만나 끝으로 향합니다.

시작 오늘 걸음 수 입력 8000보 이상? 예 아니오 달성 출력 미달 출력 끝

반복 구조

조건을 검사해 같은 처리를 반복할지 정하는 구조입니다. 처리를 마치면 조건을 검사하는 단계로 되돌아갑니다.

시작 합계를 0으로 두기 첫날부터 보기 7일을 다 봤나? 예 아니오 그날 걸음 수 더하기 날짜를 하루 넘기기 합계 출력 끝

선택과 반복은 무엇이 다른가

두 구조 모두 마름모로 조건을 검사한다는 점이 같아서 자주 뒤섞입니다. 차이는 마름모에서 나온 화살표가 어디로 가느냐에 있습니다. 선택 구조는 두 화살표가 각자 다른 길을 거쳐(한쪽은 아무 처리 없이 지나가기도 합니다) 끝으로 향합니다. 반복 구조는 한쪽 화살표가 처리를 마친 뒤 조건을 검사하던 단계로 되돌아옵니다. 되돌아가는 화살표가 있으면 반복이라고 보면 됩니다.

반복 구조에는 빠져나갈 길이 있어야 합니다

일주일 걸음 수 반복 순서도에서 처리 상자 안의 「날짜를 하루 넘기기」 때문에 본 날짜가 한 바퀴마다 하루씩 늘어나고, 그래서 언젠가 「7일을 다 봤나?」가 「예」가 됩니다. 만약 날짜가 늘어나지 않는다면 조건은 영원히 「아니오」이고, 알고리즘은 끝나지 않습니다. 그러면 유한성 조건을 어기게 됩니다. 반복을 그릴 때는 무엇이 조건을 「예」로 바꾸어 주는지를 반드시 확인합니다.


실제 알고리즘은 셋이 섞여 있다

세 구조를 따로 배웠지만 실제 알고리즘에서 하나만 쓰이는 일은 드뭅니다. 일주일치 걸음 수를 모으는 알고리즘이라면 하루치를 더하는 일을 반복하고(반복), 더한 값을 목표와 비교하여 판정하고(선택), 그 결과를 차례로 저장해 알려 줍니다(순차). 알고리즘을 설계할 때 할 일은 문제에 맞는 구조를 골라 엮는 것입니다.

스스로 확인

「라면이 익을 때까지 계속 저어 준다」는 어떤 제어 구조일까요? 그렇게 판단한 근거를 화살표가 어디로 가는지로 설명해 보세요.

핵심 정리

알고리즘

algorithm

  • 표현 언어와 상관없다 — 글로 적든 말로 설명하든 할 일의 차례까지 밝히면 된다
  • 프로그램과 다르다 — 프로그램은 알고리즘을 특정 언어로 옮긴 것
  • 밖으로 표현해야 남과 컴퓨터가 따라올 수 있다

다섯 가지 조건

알고리즘인지 아닌지를 구분한다

  • 수행 가능성 · 입력 · 출력 · 명확성 · 유한성
  • 받을 것이 없어 입력이 없는 알고리즘은 있지만, 출력은 하나 이상 있어야 한다
  • 좋은 알고리즘인지를 구분하는 기준은 아니다

세 가지 표현

자연어 · 의사코드 · 순서도

  • 같은 알고리즘을 적는 방식이 다를 뿐이다
  • 크기와 읽을 사람에 따라 고르고, 함께 쓸 수도 있다
  • 순서도는 모양마다 뜻이 정해져 있다

세 가지 제어 구조

순차 · 선택 · 반복

  • 순차 — 나뉘지도 되돌아가지도 않고 차례대로
  • 선택 — 조건에 따라 나뉘었다가 다시 만나 끝으로
  • 반복 — 처리를 마치면 조건 검사로 되돌아간다

확인 퀴즈

배운 내용을 확인해 봅시다.

Q1

「소금을 적당히 넣는다」라는 단계는 알고리즘의 다섯 조건 가운데 무엇을 어긴 것일까요?

Q2

알고리즘의 표현 방법에 대한 설명으로 옳지 않은 것은?

Q3

순서도에서 선택 구조와 반복 구조를 구별하는 가장 확실한 단서는?