네모칸 안에는 무엇을 할지 적고 다이아몬드 안에는 결과를 비교해서 어느 네모칸으로 이동할지 결정하는 과목이었다. 이것을 순서도라고 하는데 나는 고등학교 졸업 후 더 이상 필요 없을 것이라 생각했지만 큰 오산이었다.
아직도 현업에서 알고리즘 순서도를 그리며 프로그래밍을 한다. 천재가 아니라면 알고리즘 순서도는 필수이다. 제대로 동작하더라도 불안전한 코드이고 어려운 문제를 해결할 경우엔 제대로 동작하지 못할 확률이 매우 높다.
회사에 입사한 후 코딩 테스트를 처음 봤을 때는 종이가 필요 없었다. 하지만 난이도가 극악인 문제를 풀다 보니 점차 프로그래밍 시간은 짧아지고 종이와 함께 하는 시간이 길어졌다. 그리고 회사에서 프로그래밍을 할 경우 전체 업무시간이 8시간이라고 하면 실제 프로그래밍 시간은 1시간이 채 되지 않는다. 무려 7시간을 생각하고 검증하고 이 방법이 최선인지 나에게 질문을 던진다. 그리고 방대한 양의 데이터를 처리할 때 시간 안에 처리할 수 있을지 또 확인한다. 여기서 시간이 많이 걸리는 이유는 무엇일까? 방대한 양의 데이터를 여러 번 확인하면서 내가 원하는 결과를 찾아내야 한다.
예를 들어 같지 않은 숫자 8개가 있을 때 3개의 수를 뽑아 내가 원하는 수를 만들어내는 코드를 작성한다고 생각하자.
[1, 3, 5, 6, 7, 10, 14, 18]에서 2개의 숫자를 뽑아 12를 만들 수 있는가?
yes! 가능하다 5와 7을 더하면 된다.
근데 이 숫자가 10만 개가 넘고 구하려는 수가 엄청 크다면?
여러분은 시간 안에 구할 수 있겠는가?
바로 프로그래밍을 하지 말고 순서도를 먼저 그려서 해결할 수 있는 방법을 찾자!
가볍게 구구단을 출력하는 프로그램을 만들어보자.
순서도로 구구단을 작성하려면 어떻게 해야 할까?
cout << "2 * 1 = 2" <<endl;
cout << "2 * 2 = 4" <<endl;
cout << "2 * 3 = 6" <<endl;
...
cout << "9 * 9 = 81" <<endl;
이렇게 일일이 타이핑하는 것은 정말 프로그래밍을 처음 배우는 사람이 할 짓이다. 우리는 조금 배웠으니 고급스럽게 해 보자.
2 * 1 = 2
이렇게 출력하고 싶을 때 앞에 있는 숫자를 A라고 하고 뒤에 있는 숫자를 B라고 하자. 최초 값은 A은 2이고 B는 1일 것이다.
cout << A << " * " << B << " = " << A *B << endl;
이렇게 출력이 가능하다.
최신 버전의 C++에서는 출력 포맷이 고정되어있을 때 다음과 같은 방법도 제공한다.
cout << format("{} *{} = {}", A, B, A*B) << endl;
이후 A와 B를 비교해서 반복 작업을 해야 한다. 순서도로 다음과 같이 그릴 수 있을까?
위처럼 프로그래밍하려면 코드가 길어지고 복잡하다. 이때 가장 적합한 반복문인 for문을 사용해보자
for문을 이용한 구구단은 순서도가 조금 다르다.
for문을 이용한 구구단은 다음과 같이 표현될 수 있다.
for (int A=2; A<10; A=A+1) {
for (int B=1; B<10; B=B+1) {
cout << A << " * " << B << " = " << A *B << endl;
}
}
for문의 문법이 아직은 어색하겠지만 굉장히 직관적이다.
인자로 초기 값을 정해준다. A=2
이후 루프를 돌 때마다 끝낼지 말지를 정해주는 비교문을 넣어준다. A<10
마지막으론 루프를 한번 돌고 나서 다음 작업을 위해 값을 변화시켜주는 구문을 넣어준다. A=A+1
중괄호 안에는 루프를 돌 때마다 무엇을 할지 적어준다.
순서도를 보면 루프 안에 루프가 하나 더 있다.
인자로 초기 값을 정해준다. B=1
이후 루프를 돌 때마다 끝낼지 말지를 정해주는 비교문을 넣어준다. B<10
마지막으론 루프를 한번 돌고 나서 다음 작업을 위해 값을 변화시켜주는 구문을 넣어준다. B=B+1