
의사코드를 통해 알고리즘 이해하기
코드를 작성하는 데에는 많은 방법이 있죠. 어떨때는 즉흥적으로 쓰기도 하구요. 어떤 다른 날에는 아주 효율적인 해결책을 생각해내고자 머리를 싸매기도 해요. 하지만 알고리즘을 다른 사람들에게 설명하게 될 때는, 어떤 방법이 가장 효율적일까요? 애초에 “알고리즘”이 뭘까요? 이 포스트에서는 이 질문들에 대해 답변해보도록 할게요.
알고리즘이 뭔가요?
캠브릿지 사전에 따르면, “알고리즘은 일련의 수학적 지시나 규칙인데, 특히 컴퓨터에게 주어졌을때 문제에 대한 정답을 계산하는데 도움이 된다”고 해요. 예를 들어서, 하나의 문자를 문자열 가운데에 삽입한다고 해볼게요. 어떤 사람들은 문자열을 두 개의 문자열로 나눌 수도 있고, 어떤 사람들은 완전히 새로운 문자열로 시작할 수도 있잖아요? 아래는 각 예시의 파이썬 코드예요:
def insert_letter(existing_string: str, inserting_index: int, inserting_letter: str) -> str:
before = existing_string[0:inserting_index]
after = existing_string[inserting_index:len(existing_string)]
return before + inserting_letter + after
def insert_letter(existing_string: str, inserting_index: int, inserting_letter: str) -> str:
new_string = ""
for index, item in enumerate(existing_string):
if index is inserting_index:
new_string += inserting_letter
new_string += item
return new_string
예시에서 볼수 있듯, 이 문제를 해결하는 방법은 당연히 한 가지보다는 많을거에요. 여기서 각 해결책이 알고리즘으로 여겨질 수 있어요. 아까 말했듯 알고리즘은 일련의 수학적 지시들이구요.
알고리즘을 시각화하는 다양한 방법
우리가 다른 사람들과 같이 일할 때, 가끔씩 알고리즘을 다른 사람들에게 설명해야 되는 상황에 이를 수 있어요. 어떤 알고리즘들은 간단히 코드로 바로 작성해낼 정도로 간단하기도 해요. 하지만 때때로 알고리즘이 아주 복잡할 수도 있어요. 이런 경우에는, 단순히 기능적으로 작동하는 코드를 작성하려고 하루종일 시간을 쓰고싶지 않을 수도 있어요. 왜냐하면 (러스트와 같은) 어떤 언어들에서는 코드를 컴파일되게 하는 것만 해도 많은 시간이 걸릴 수도 있기 때문이에요.
그래서 종종 다른 사람들이 이해하도록 돕도록 여러 가지 수단을 사용하는 거에요. 코드를 실제로 작성하지 않고도 코드를 설명할 수 있기도 하구요. 이런 수단에는 순서도(flowchart), 의사코드(pseudocode), 칠판에 그림 그리기, 단계별로 하나씩 설명하기 등이 있어요.


insert_letter
함수 구현의 순서도 예시.순서도는 과정을 묘사하는 도표예요.
그래서 의사코드가 뭔가요?
위키백과에 있는 정의에 따르면, 의사코드는 프로그래밍 언어들의 규칙을 혼합한 알고리즘 단계들의 설명이라고 해요. 다른 말로 풀어서, 의사코드는 실제 코드가 아닌 설명을 위한 코드라는 거죠. 의사코드는 언어에 국한되있지 않기도 해요 (language agnostic). 어떤 특정한 언어나 패러다임도 우선시되지 않는다는 뜻이에요. 의사코드는 꽤 괜찮은 소통 도구랍니다.
아래는 이름의 스펠링을 불러주는 프로그램의 예시 의사코드예요.
function main() {
name_input = input("What is your name : ");
is_loop = true;
while (is_loop) {
agreement_input = input("Can I spell your name\nEnter 'y' or 'n'. : ");
if (!agreement_input.is_empty()) {
is_loop = false;
}
}
if (agreement_input == "y") {
for (item) in (name_input.chars()) {
print(item);
}
print("Here is your name spell {}", name_input);
} else {
print("Exiting the prgram...");
}
}
use std::io::{self, Write};
fn main() {
let mut name_input = String::new();
print!("\nWhat is your name : ");
io::stdout().flush().unwrap();
io::stdin()
.read_line(&mut name_input)
.expect("Failed to read input");
let mut is_loop = true;
let mut agreement_input = String::new();
while is_loop {
print!("\nCan I spell your name?");
io::stdout().flush().unwrap();
print!("\nEnter 'y' or 'n'. : ");
io::stdout().flush().unwrap();
io::stdin()
.read_line(&mut agreement_input)
.expect("Failed to read input");
agreement_input = agreement_input.trim().to_string();
if !agreement_input.is_empty() {
is_loop = false;
}
}
if agreement_input == "y" {
for item in name_input.chars() {
println!("{}", item);
}
println!("Here is your name spell, {}!", name_input.trim());
} else {
println!("Exiting the program...")
}
}
어떻게 생각하시나요? 유사점이 보이시나요? 의사코드가 러스트 코드에서 언어에 특정한 부분들을 단순화해줬어요. 그래도 의사코드는 그 자체로서는 실제 코드가 아니라는 점을 명심해주세요. 즉, 작성자가 사용하는 문법을 정한다는 거에요. 작성자의 선호에 달려있다는 말이죠!
댓글 남기기