"AlgoSpot DRAWRECT 문제 풀이"에 대한 2가지 코드를 준비해 봤습니다. 그중에서 첫번째로 절차지향적으로 문제를 풀어보는 코드입니다. 알고리즘 자체를 코드로 변환하는 방법에 대해서 익숙하지 않거나, 사람이 인식할 수 있는 코드를 작성하는 방법을 잘 모르시는 분들을 위해 준비한 것입니다.
컴퓨터가 이해하는 코드는 어느 바보나 다 짤 수 있다. 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 짠다.
- 마틴 파울러 : Martin Fowler (리팩토링 저자).
▶ 주 플로우 챠트 작성 (Draw main flow chart)
앞서 알고리즘 문제 풀이에서 기술한 흐름을 순서도(flow chart)로 작성해 봅니다. 논리 전개에 익숙하지 않은 분들은 가급적 바로 코딩에 뛰어들지 마시고, 귀찮더라고 문제를 풀 때마다 플로우 차트를 그리는 연습을 해야 합니다. 그리고 가급적이면, 파워포인트 혹은 플로우 챠트 그리는 도구를 사용하지 말고, 직접 종이에 그려 보는 것을 권장합니다. 그래야 좀 더 논리적인 전개에 집중할 수 있습니다. 플로우 차트를 도구 없이도 머리 속에서 그릴 수 있게 되면, 그 다음에는 종이나 파워포인트 없이 바로 코딩을 시작해도 됩니다.
▶ 서브루틴 플로우 챠트 작성 (Draw subroutine flow chart)
▶ 절차적 코드 작성
절차적 프로그래밍 패러다임을 적용하기 위해 C 언어로 작성하였습니다. 아래 코드를 보시면, 여러 개의 좌표를 저장하기 위해 구조체(struct)를 사용하신 것을 확인할 수 있습니다. 논리(logic)도 중요하지만, 프로그래밍 언어들에서 제공하는 구조체 등을 활용하면 보다 사람이 이해하기 좋은 코드 (직관적이고, 가독성 높은)를 작성하실 수 있습니다.
#include <stdio.h> #include <stdlib.h> /* x,y 좌표를 표현하는 점(point) 구조체를 정의한다. */ typedef struct { int x; int y; } point; int main(int argc, char *argv[]) { // 테스트 케이스 반복 횟수 및 좌표 변수 생성 및 초기화 int cnt = 0; point p1 = {0, 0}; point p2 = {0, 0}; point p3 = {0, 0}; point p4 = {0, 0}; // 테스트 케이스 반복 횟수 입력. int testCaseCount; printf("Input test case number : "); scanf("%d", &testCaseCount); // 입력 받은 테스트 케이스 수만큼 반복 처리... for(cnt=0; cnt<testCaseCount; cnt++) { // pt, p3, p3 등 3개의 좌표 값 입력 printf("Input p1 (x, y) : "); scanf("%d %d", &p1.x, &p1.y); printf("p1.x = %d, p1.y = %d\n", p1.x, p1.y); printf("Input p2 (x, y) : "); scanf("%d %d", &p2.x, &p2.y); printf("p2.x = %d, p2.y = %d\n", p2.x, p2.y); printf("Input p3 (x, y) : "); scanf("%d %d", &p3.x, &p3.y); printf("p3.x = %d, p3.y = %d\n", p3.x, p3.y); // 4번째 좌표 계산 (p1 ~ p3는 입력, p4 는 출력 용도의 인자[argument]) int returnCode = calculateP4(&p1, &p2, &p3, &p4); // 정상적으로 계산된 경우, 네번째 좌표 출력 if(returnCode == 0) { printf("Result p4.x = %d, p4.y = %d", p4.x, p4.y ); } // 잘못된 입력 좌표가 존재할 경우, 에러 메시지 출력 및 프로그램 종료. else { printf("Error : Invalid coordinate"); return 1; } } return 0; } /* * p1, p2, p3 등 3개의 좌표 값을 입력받아, p4 좌표 계산. * * 만일, 잘못된 자표가 입력된 경우 -1 반환, 정상적으로 좌표를 계산한 경우 0 반환. */ int calculateP4(point *p1, point *p2, point *p3, point *p4) { // p4.x 좌표 계산 if(p1->x == p2->x) { p4->x = p3->x; } else if(p1->x == p3->x) { p4->x = p2->x; } else if(p2->x == p3->x) { p4->x = p1->x; } else { return -1; } // p4.y 좌표 계산 if(p1->y == p2->y) { p4->y = p3->y; } else if(p1->y == p3->y) { p4->y = p2->y; } else if(p2->y == p3->y) { p4->y = p1->y; } else { return -1; } return 0; }
▶ 실행 결과
위와 같은 코드의 실행 결과(예시)는 아래와 같습니다.
Input test case number : 1
Input p1 (x, y) : 10 30
p1.x = 10, p1.y = 30
Input p2 (x, y) : 45 30
p2.x = 45, p2.y = 30
Input p3 (x, y) : 10 65
p3.x = 10, p3.y = 65
Result p4.x = 45, p4.y = 65