2019년 2월 21일 목요일

[서울대 컴퓨터의 개념 및 실습 PA 1] 이중 for문을 이용한 구구단 출력


컴퓨터의 개념과 실습

*본 보고서는 이미 제출된 적이 있는 보고서입니다. 표절 시 발각될 확률이 매우 높으니 참고용으로만 사용해주십시오.




1. Introduction

1.1. 문제
9단까지의 구구단을 3 X 3 칸 안에 출력하도록 프로그래밍하라. 조건은 다음과 같다.
① 이중 for 문을 사용하라.
② 외부 함수를 main 함수 내에서 사용하라.
③ main 함수의 코드를 15줄 이하로 작성하라.
④ C#을 이용해서 코드를 작성하라.
1.2. 프로그램의 구성
1.2.1 알고리즘
우선, main 함수에 대한 알고리즘 순서도는 다음과 같다.
그림 1: main 함수의 알고리즘 순서도
또, main 함수에서 사용된 mul 함수에 대한 알고리즘 순서도는 다음과 같다.
그림 2: mul 함수의 알고리즘 순서도
이때, mul 함수에서 a와 b의 값은 main 함수에서 지정해 줄 것이므로 그 값에 대한 입력부의 내용은 순서도에서 딱히 명시하지 않았다.
1.2.2 코드의 구현 전 계획
정의하는 변수의 개수를 줄이려고 하였다. 이는 다른 이유보다는 코드를 읽는 사람의 가독성을 위해서 였는데, 예를 들어, 외부의 함수가 어떤 값을 return해야 할 때, 굳이 하나의 변수를 새로 지정해서 그 변수를 return하게 하지 않고 아예 계산부를 return과 함께 통합시켜버리는 등의 노력을 하였다. (return a*b;)
또한, if 문 등등 결과 출력까지 걸리는 시간을 오래 걸리게 하는 요소들을 최대한 없앴다. 기존에는 곱셈의 결과값이 10 이상일 때 10 미만일 때보다 공백의 수(스페이스바)를 하나 줄여서 3 X 3칸이 삐뚤어지지 않게 생성되게 하도록 계획을 하였으나, 컴퓨터의 연산을 용이하게 하기 위해 그 대신 “\t”을 Print하는 String에 넣어서 칸이 삐뚤어지지 않도록 하는 방법을 택하기도 하였다. 나눗셈이나 나머지를 구하는 계산 같이 시간을 많이 소요하는 계산식보다는 덧셈으로만 프로그램이 구동될 수 있게끔 노력하였다.
익숙하지 않은 ref를 사용해서 프로그래밍하기 복잡하게 만들기보다는 간단하게 리턴 값을 반환하는 형식의 외부 함수를 만들어서 코딩의 난이도를 상대적으로 낮게 하는 것에도 또한 노력을 쏟았다.
1.2.3 코드
위에서 계획한 알고리즘을 C# 프로그래밍 언어로 구현하면 다음과 같이 쓸 수 있다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

이렇게 콘솔 창의 출력과 연산에 필요한 라이브러리를 불러온다.

namespace Homework1
{
class Program
{
static void Main(string[] args)
{
  for (int i = 1; i < 8; i = i + 3)
  {
   for (int j = 1; j < 10; j++)
   {
    Console.Write("{0} * {1} = {2}\t", i, j, mul(i, j));
    Console.Write("{0} * {1} = {2}\t", i+1, j, mul(i+1, j));
    Console.Write("{0} * {1} = {2}\n", i+2, j, mul(i+2, j));
   }
    Console.Write("\n");
  }
}

// i는 첫 번째 세로줄의 단(1단, 2단…) 수가 되고, j는 단 수에 곱해질 수(1 * 2에서 2)가 된다.

여기까지 그림 1의 알고리즘을 구현하였다. for 문의 존재를 이용하여 알고리즘에서 설명한 것보다 훨씬 간단하게 코딩을 할 수 있었다.

static int mul(int a, int b)
 {
  return a * b;
}
// 곱셈 결과값을 내놓는 함수 mul
}
}

문제에서 주어진 대로 외부 함수를 main 함수에서 불러오도록 설정해두었다.
2. Result
그 결과는 그림 1과 같다.
그림 3: 프로그램 출력물 결과
문제에서 지정해 준 대로 결과가 출력되었다.
3. Conclusion
결과는 성공적이었다. 문제에서 요구하는 그대로 프로그램이 콘솔 창에 출력을 마쳤다.
내 기준으로 최대한 간단한 알고리즘을 사용하여 코딩을 하였으나, 이것보다 더 간단한 알고리즘이 있는지 궁금하다,
사실 컴퓨터의 연산 부담을 덜기 위해서는 그에 대비하여 사람이 미리 계산을 해 놓으면 편하다는 것을 새삼 느끼게 되었다. 예를 들어, 1부터 100까지 더하는 프로그램을 개발한다고 했을 때, 가우스의 방법을 쓰지 않으면 for 문을 이용해서 더하는 수밖에 없으나, 가우스의 방법을 사용한다면 라는 간단한 식을 컴퓨터로 하여금 계산하게 함으로써 컴퓨터의 계산을 충분히 덜어줄 수 있을 것이다. 마찬가지로, 컴퓨터의 연산을 이 알고리즘에서 최대한 덜어주려고 한다면, 사람이 일일이 구구단을 한 줄 씩 Console.Print 하는 방법을 택하면 될 터이다. 하지만 우리가 이 방법을 택하지 않는 이유는 사람의 노동 때문이다. 사람의 불필요한 노동이 결국 전체적으로는 비효율성을 불러오기 때문에 그 방법을 택하지 않은 것이라고 생각이 된다. 과연 컴퓨터의 연산과 사람의 노동 그 밸런스가 이루어지는 구간이 어디에 있을지, 이를 수학적, 논리적으로 찾아낼 수 있을 지가 궁금하다.
* Reference
1 서울대학교, <Programming Assignment #1>, 2018, 1