알고리즘의 세 기본 구조 중 가장 단순한 것이 순차구조다. 명령을 위에서 아래로 차례대로 실행하는, 가장 자연스러운 흐름이다. 단순하지만 모든 프로그램의 뼈대이며, "입력 → 처리 → 출력"이라는 기본 골격을 익히는 출발점이다. 수업에서 Raptor로 직접 그려 돌려본 예제들을 함께 정리했다.
1. 순차구조란?
명령어들이 주어진 순서대로 실행되어, 한 방향으로만 진행되는 가장 기본적인 제어구조다. 분기도 반복도 없이 위에서 아래로 흐른다.
작성의 기본 절차는 입력 → 처리 → 출력 세 단계다.
- GET(입력): 값을 변수에 입력받는다.
- 처리(대입문 ←): 입력받은 값으로 계산한다.
- PUT(출력): 결과를 출력한다.
이때 세 단계를 또박또박 분리해 쓰는 게 좋은 습관이다. 한 줄에 입력·계산·출력을 욱여넣으면 읽기 어렵고, 중간에서 잘못된 부분을 찾기도 힘들다.
수업에서 쓴 Raptor의 표기를 정리하면 이렇다.
- 입력:
"안내문" GET 변수(평행사변형) - 대입:
변수 ← 식(직사각형, 화살표는 "오른쪽 값을 왼쪽에 저장") - 출력:
PUT "문자열" + 변수(평행사변형) - 함수·상수:
sqrt()(제곱근),floor()(내림),mod(나머지),pi(원주율) 등을 바로 쓴다
2. 순서도로 보는 기본형 (예제: 두 수 교환)
가장 자주 나오는 swap을 Raptor 순서도로 그리면 이렇다. 직사각형은 처리, 평행사변형은 입출력, 타원은 시작·끝이다.
Start GET x, y temp ← x x ← y y ← temp PUT "x="+x+", y="+y End

임시 변수 temp 없이 x ← y; y ← x로 하면, 첫 줄에서 x값이 y값으로 덮여 사라져 둘 다 같은 값이 되어버린다. 직접 돌려보니 정말 둘 다 20이 나와서, "대입은 한 방향으로 덮어쓴다"를 몸으로 알았다. 단순해 보이는 swap이 의외로 핵심 개념을 담고 있었다.
3. 수업에서 풀어본 예제
순차구조 문제는 "공식을 그대로 입력 → 처리 → 출력으로 옮기는" 형태다. 너무 쉬운 합·차 계산은 빼고, 함수·나머지 연산이 들어가는 예제들을 골라 정리했다.
떨어진 시간 t를 입력받아 낙하 거리 d를 구한다. d = ½·g·t² (g=9.8).
GET t → g ← 9.8 → d ← (1/2) * g * t^2 → PUT "Falling distance="+d+"m"입력 10 → 출력 490m. 거듭제곱은 Raptor에서
^ 또는 **로 쓴다.
10분에 18km를 달리는 기차가 162km 가는 데 걸리는 시간을 시·분·초로 출력한다.
v ← 18 / (10 * 60) // 초속(km/s)
t ← 162 / v // 총 걸린 초
h ← floor(t / 3600) // 시
secs ← t - h * 3600
m ← floor(secs / 60) // 분
s ← secs mod 60 // 초
PUT h+" hours "+m+" minutes "+s+" seconds" // 1 hours 30 minutes 0 seconds
큰 단위부터 floor로 떼고, 남은 값에 mod를 쓰는 게 "단위 분해"의 정석 패턴이다.
타수 num, 안타 hit를 입력받아 타율을 소수 넷째 자리에서 반올림해 할·푼·리로 나눈다.
hitrate ← hit / num
hitrate ← hitrate + 0.0005 // 넷째 자리 반올림 트릭
hal ← floor(hitrate * 10)
pun ← floor(hitrate * 100) - hal * 10
ri ← floor(hitrate * 1000) - hal * 100 - pun * 10
PUT hal+"Hal "+pun+"Pun "+ri+"Ri" // 7타수 3안타 → 4Hal 2Pun 9Ri
"+0.0005를 더해 반올림을 흉내 내는" 발상이 인상적이었다. 자릿수를 floor로 하나씩 깎아내는 게 단위 분해와 같은 원리였다.
4. 유제
수업 유제 중 순차구조 감각을 키우기 좋은 것들이다.
- 유제 3-7: 좌표평면 두 점 (x1,y1),(x2,y2)의 거리 구하기 →
sqrt((x2-x1)^2 + (y2-y1)^2) - 유제 3-8: 세 변수 x→y→z→x로 회전 교환 (10,20,30 → 30,10,20). temp 하나로 어떻게 돌릴지 고민해보면 좋다.
- 유제 3-10: 초 단위 t를 시·분·초로 (85490 → 23h 44m 50s). 예제 3-11의 분해 패턴 그대로.
- 유제 3-11: 반지름 6400km 지구의 자전 속력(m/sec) 구하기 → 둘레 ÷ 86400초.
특히 유제 3-8(세 변수 회전)은 swap을 확장한 문제라, temp 하나로 순서를 어떻게 맞출지가 핵심이다.
5. C 코드로 다시 풀어보기
Raptor에서 익힌 순차구조는 C에서도 그대로 입력 → 처리 → 출력으로 옮기면 된다.
예제: 두 수 교환
먼저 Raptor식 흐름으로 보면 입력 뒤 처리 상자 3개가 일직선으로 이어진다. 분기도 반복도 없고, 임시 변수에 백업하는 순서만 중요하다.
#include <stdio.h>
int main(void)
{
int iFirst;
int iSecond;
int iTemp;
printf("두 정수 입력: ");
scanf("%d %d", &iFirst, &iSecond);
iTemp = iFirst;
iFirst = iSecond;
iSecond = iTemp;
printf("첫 번째 값: %d\n", iFirst);
printf("두 번째 값: %d\n", iSecond);
return 0;
}
| 단계 | iFirst | iSecond | iTemp |
|---|---|---|---|
| 입력 직후 | 10 | 20 | 미정 |
iTemp = iFirst |
10 | 20 | 10 |
iFirst = iSecond |
20 | 20 | 10 |
iSecond = iTemp |
20 | 10 | 10 |
표로 보면 임시 변수가 왜 필요한지 분명하다. iFirst가 먼저 덮여도 iTemp에 원래 값이 남아 있기 때문이다.
유제 3-10형: 초를 시·분·초로 분해
이 문제도 순차구조다. 총 초를 입력받고, 큰 단위부터 차례대로 떼어낸 뒤 출력한다.
int iTotalSecond;
int iHour;
int iMinute;
int iSecond;
int iRemainSecond;
printf("초 입력: ");
scanf("%d", &iTotalSecond);
iHour = iTotalSecond / 3600;
iRemainSecond = iTotalSecond % 3600;
iMinute = iRemainSecond / 60;
iSecond = iRemainSecond % 60;
printf("%d시간 %d분 %d초\n", iHour, iMinute, iSecond);
큰 단위부터 몫으로 떼고, 남은 값은 나머지로 넘기는 방식이다. 85490초를 넣으면 23시간 44분 50초가 된다.
오늘 느낀 점
- 가장 단순한 순차구조에서도 swap의 임시 변수처럼 핵심 개념이 숨어 있었다. 직접 Raptor로 돌려 두 값이 똑같아지는 걸 봐야 제대로 이해됐다.
- 시·분·초 변환, 타율 할푼리처럼 "큰 단위부터 floor로 떼고 mod로 남기는" 분해 패턴이 여러 예제에서 반복됐다. 패턴 하나를 잡으니 비슷한 문제가 다 풀렸다.
- 순차구조만으로는 "조건 분기"도 "반복"도 안 된다는 한계를 느끼니, 다음에 배울 선택·반복 구조가 왜 필요한지 자연히 와닿았다.
한 걸음 더
- swap에 임시 변수가 필요한 건 "대입은 한 방향으로만 덮어쓴다"는 성질 때문이다. 임시 변수 없이 교환하는 기법(
x = x+y; y = x-y; x = x-y;)도 있지만, 값이 너무 크면 오버플로 위험이 있어 실무에선 대개 임시 변수를 쓴다. 단순해 보이는 swap에도 trade-off가 숨어 있는 셈이다. - 타율 예제의
+0.0005반올림은 "원하는 자리 + 0.5 단위를 더하고 내림"하는 고전 트릭이다. 다만 부동소수점 오차로 경계값에서 어긋날 수 있어, 실무에서는 언어가 제공하는 반올림 함수(round)를 쓰는 게 안전하다. - 화씨-섭씨 같은 변환에서 정수끼리 계산하면
5/9가 0이 되는 함정이 있다. 순차구조 문제의 절반은 사실 "자료형과 정수 나눗셈"을 제대로 다루느냐에서 갈린다. 실수 결과가 필요하면5.0/9.0처럼 실수로 만들어야 한다.
'computer_science > algorithm' 카테고리의 다른 글
| [알고리즘] 02. 순서도와 Raptor 기초 (0) | 2026.07.18 |
|---|---|
| [알고리즘] 01. 알고리즘 개요와 복잡도 (0) | 2026.07.06 |