알라딘 코딩

코딩 사고법 : 문제를 흐름으로 풀어내기, 잘게 쪼게서 흐름을 따라.

BitzFlex 2025. 3. 21. 11:26

 

 

사람은 어떤 문제를 해결하고자 생각할 때 입체적(전체적, 종합적)으로 하는 것 같습니다.

어떤 해결해야 하는 문제가 있을 경우, 이를 전체 덩어리의 형태로 생각하는 것 같습니다. 

 

마치 그림을 보는 것 같이, 전체의 모습을 보는 듯이 사고를 하는 것 같습니다. 

 

프로그램 코딩은 한 번에 전체를 보는 그림이 아니라, 

음악과 같이 흐름이 있는 방식으로 접근을 해야 합니다. 

또는 마치, 글의 흐름으로 생각을 적는 것과 같다고 생각합니다. 

 

프로그램 코딩은 그림을 그리는 것이 아니라, 흐름을 만드는 음악을 작곡하거나 글을 쓰는 것과 더 유사한 것 같습니다. 

이런 습관이 안되어 있어서 처음 코딩을 할 때는 어려움을 느끼는 것 같습니다. 

 

컴퓨는 전자적으로 숫자를 다루는 기능을 하는 기계이며. 다음의 특징을 가지고 있습니다.

  • 아주 아주 빠른 속도로 계산을 한다. 요즘 애플의 맥북에 들어가는 M4 CPU 의 경우 초당 11조 번의 연산이 가능하다고 합니다. (반복 속도가 빠르다고 생각할 수도 있습니다. )
  • 계산이 항상 정확합니다. (사칙 연산, 비교 등을 항상 정확한 답을 냅니다.) 
  • 저장한 값을 잃어 버리는 법이 없습니다. (variable에 저장한 값이 변하거나 하지 않습니다.)

코딩은 이러한 컴퓨터의 특성을 이용해서 , 어떤 처리의 흐름을 만들어서 문제를 해결하는 것입니다. 

 

 

가장 간단한 예를 가지고 생각해 보지요. 

1 부터 1000까지의 수를 더한 값을 출력하는 프로그램을 만든다고 생각해 보지요. 

 

컴퓨터 프로그램은 아주 단순합니다. 

말 그대로 1부터 1000까지의 수를 그냥 더하면 됩니다. 아주 단순 무식합니다.

 

사람으로서는 말도 안되는 접근법이지요. 언제 1부터 1000까지의 수를 계속 더하고 있겠습니까..?

하지만, 컴퓨터는 1초에 몇조 번의 계산을 할 수 있으니, 아주 아주 잠깐의 시간 밖에 걸리지 않습니다.

이게 컴퓨터 프로그램 코딩적 접근힙니다. 

  • 합계 결과값인, 누적값을 저장할 Variable을 만든다. (초기화는 0으로 한다.)
  • 1부터 1000까지의 수를 하나씩 누적값을 하고 있는 Variable에 더한다. 

단순합니다.

어떤 반복된 흐름입니다.

컴퓨터는 무지무지 빠른 속도로 반복해서 정확한 계산을 하고, 저장된 값을 잃어버리지 않습니다. 

 

사람이 이 문제를 푼다면, 등차수열 공식인 n(n+1)/2 로 문제를 해결할 것입니다. 

사람은 이런 공식을 배워서 알고 있기 때문입니다.

이는 이미 문제를 푸는 방식을 알고 있기 때문에 가능한 방법입니다. 

 

컴퓨터는 뭔가를 배우는 것이 없습니다. 스스로 사고를 하지도 못합니다. (현재의 AI 는 마치 배우고, 생각하고 새로운 무엇인가를 창조하는 것 같지만, 사실은 이도 현재까지는 확률과 통계를 이용한 계산의 결과이지 스스로 생각하는 것은 아닙니다.) 

 

 

프로그램 코딩을 할때는 이미 해결책을 아는 (등차수열의 공식을 아는 것 같은)것에 대한 것만 하는 것은 압니다.

조금 더 복잡한 다른 예를 들어 보겠습니다. 

 

 

1부터 1000 사이의 소수(Prime number - 1과 자기 자신을 제외한 어떤 수로도 나누어지지 않는 정수) 들을 찾아서 출력하는 프로그램을 만든다고 생각해 보죠.  등차수열과는 다르게 아직 소수를 만드는 공식은 없습니다.

 

어떻게 접근을 하면 될가요 ?   단순합니다. 

 

사람이 하는 식으로 생각해보면 , 종이에다 숫자들을 적어 놓고 한 숫자씩 다른 숫자들로 나누어지는지 해보는 것 입니다.

숫자들을 적고 반복해서 계산을 하는 것을 컴퓨터에게 시키는 것 뿐입니다. 

사람이 수작업으로 하는 방법을 모르면 코딩도 할 수 없는 것입니다. 어떤 방법으로든 수작업으로 할 수 있는 방법을 찾고 단지 그 작업을 컴퓨터를 시켜서 편하고 빠르게 하는 것 뿐입니다.

 

  • 1부터 1000 사이의 모든 수에 대해
  • 그 수가 소수인지 판단을 해서 소수이면 출력을 한다. 

와 같습니다. 

 

 

 

 

여기서 어떤 수가 소수인지는 어떻게 판단할까요?

마찬가지로 단순합니다. 

 

  • 2부터 (모든 수가 1로는 나누어지므로 2부터)  소수인지 판단해야 하는 수보다 1 작은 모든 수에 대해(자기 자신으로는 나누어지므로 하나 작은 수까지만) 
  • 나누어지면 (나눗셈을 한 나머지가 0) 이면 소수가 아니다. 

로 해결할 수 있습니다.

 

결국은 반복과 계산과 판단입니다. 

목적하는 문제를 해결하기 위해 어떻게 반복하고 계산하고 판단을 하느냐가 다입니다. 

 

이런 일련의 흐름을 만드는 것이 코딩입니다. 

 

위의 예를 들면 1 ~ 1000까지 수에 대한 반복 내에 다시 소수를 판단하기 위한 반복이 들어갑니다.

코드로 얘기를 하면 for 문 내에 다시 for 문이 들어가 있는 것입니다. 

 

이를 C 코드로 적어보면 다음과 같습니다.

 

for (no = 1; no <= 1000; no++).  : 1부터 1000의 수들에 대해 

{

    prime = true.  : 해당 수가 소수인지를 저장하는 상태 저장 variable 

 

    for (p = 2;  p < no; p++).  : 2부터 판단해야 하는 수보다 1 작은 모든 수에 대해서 

    {

          if  ( no를 p로 나눈 나머지가 0 이면 )   : 나누어 떨어지는 지를 판단한다. 

               prime = false                             : 나누어 떨어지므로 소수가 아니라고 상태를 저장

    }

 

     if (rime)   :    2부터 자신을 제외한 어떤 수로도 나누어지지 않은 경우이므로 소수이므로 출력 

       print no        

}

 

반복, 계산, 판단, 출력으로 문제를 해결합니다. 

 

위 코드는 for 문내에 for 문이 또 들어가 있어서 코드를 보기에 관심이 분산되고 잘 읽히지 않습니다.

이를 좀 더 좋게 하기 위해, 앞장의 함수를 이용하면 다음과 같이 바꿀 수 있습니다. 

 

for (no = 1; no <= 1000; no++).  : 1부터 1000의 수들에 대해

{

   if is_prime(no) 

       print no 

 }       

 

함수 is_prime(no).  : is_prime 함수는 no 가 소수이면 true 아니면 false를 알려주는 기능을 한다. 

{

   prime = true 

   for (i =2 ;  i < no; i++)

   {

          if  ( no를 p로 나눈 나머지가 0 이면 )   : 나누어 떨어지는 지를 판단한다.

               prime = false                             : 나누어 떨어지므로 소수가 아니라고 상태를 저장

    }

     

    return prime.   : 소수 여부를 반환한다. 

}

 

사람이 쓰는 글과 좀 더 비슷해져서 코드를 읽기 좋아졌습니다.

그리고 문제를 작은 조각들로 나누어서 해결을 했습니다. 

이렇게 하면 함수 is_prime(no)는 어떤 수가 소수인지를 판단해야 하는 다른 곳에서도 사용할 수 있습니다.

 

프로그램을 이루는 작은 부품을 만든 것입니다. 

 

어떤 프로그래밍 언어에도 반복, 계산, 판단, 출력 기능은 있습니다. 

위의 코드를 실제 배우고 있는 언어로 구현해서 실행시켜 보기 바랍니다.

 

 

프로그램 언어에서 문법은 아주 작은 부분입니다. 외우지 않고, 필요할 때 찾아가면서 해도 됩니다.

중요한 것은 절차적인 사고로(마치 글을 쓰는 것 같은) 문제를 해결하는 방법, 프로그래밍 언어에 대한 개념입니다. 

 

 

그리고, 추가로 위의 코드는 개선할 부분이 몇 개 있습니다.

 

  • 소수인지 판단하는 함수는 , 2부터 판단해야 하는 수 보다 1 작은 모든 수에 대해 판단을 할 필요가 없습니다. 어떤 수로도 나누어지면 소수가 아니니, 반복의 과정에서 어떤 수로 나누어졌다면 그 즉시 소수가 아니라고 알려주고 반복을 중단해야 합니다. 
  • 이미 소수인 것으로 판단된 수들을 저장하고 있다가 그 수들로 판단 속도를 더 빠르게 할 수 있습니다. (소수로 나누어 떨어지는 수들은 소수가 아니니, 1부터 1000 사이의 수들 중 소수로 판단된 수들로 나누어지는 값은 소수 인지 판단하는 함수를 호출할 필요가 없습니다.) 

 

 

과거의 컴퓨터는 속도도 느리고, 저장공간도 적어서 효율적인 프로그램을 작성하는 것이 중요했습니다. 

등차수열 같은 경우는 반복을 이용하는 게 아니라 n(n+1)/2와 같은 공식을 이용해야 하는 것이고, 위에 적은 소수 판단에 대한 개선 내용들을 적용하는 것이 중요했습니다.  

 

요즘은 과거와는 비교도 안될 정도로 컴퓨터의 속도도 빠르고, 저장공간(메모리)도 크지만, 그래도 효율적인 코드를 작성해야 하는 것은 마찬가지입니다.  다만, 버전업이라는 개념으로 일을 마쳐야 하는 시간을 고려해서 어떤 방식(아주 효율이 중요한지 또는 개발을 빠르게 진행하는 게 좋은지)을 선택하는 게 좋습니다. 

 

 

이와 같이 프로그램이 좀 더 효율적이고 빠르게 수행될 수 있도록 하는 것에 필요한 것이

앞으로 설명할 알고리즘과 자료구조(Data Structure)입니다. 

 

이에 대해서는 앞으로의 글에 적겠습니다.