수열의 어떤 두 정수의 합이 주어진 숫자가 되는 경우 판별 그(it) 얘기

트랙백: 어떤 두 정수의 합이 주어진 숫자가 되는 경우가 있는가? - object


일단 문제는, 다음과 같이 정렬된 임의의 숫자 배열있다고 할 때...

int a[] = {1, 4, 7, 9, 10};

여기에 어떤 정수 n 이 주어졌다고 할때, 배열 내의 두 정수의 합이 n이 되는 경우가 있는지 판별하는 겁니다.
가령 n = 19라고 하면, 9 + 10 = 19 이므로 참(true) 입니다.

뭐, 자세한 내용은 트랙백된 주소를 따라가 보면 되겠고... (무책임...)

그런데 중요한 문제는, 이것을 가능한 최적화된 알고리즘(속도도 빠르면서 메모리도 덜 잡아먹는)으로 풀어보자는 것입니다.


일단 아직 검증이 끝난건 아니지만, 제가 생각한 알고리즘은 대략 이렇습니다.

bool CheckSum(unsigned int numbers[], unsigned int length, unsigned int sum)
{
   unsigned int* num1 = &numbers[0];
   unsigned int* num2 = &numbers[length-1];
   unsigned int  pair = 0;

   while (*num1 < *num2) {
      if (sum >= *num2) {
         pair = sum - *num2;

         if (*num1 == pair) return true;
         else if (*num1 < pair) {
            num1++;
            continue;
         }
      }

      num2--;
   }

   return false;
}


트랙백

  • 어떤 두 정수의 합이 주어진 숫자가 되는 경우가 있는가? 2007/08/08 20:48 #

    어떤 두 정수의 합이 주어진 숫자가 되는 경우가 있는가? - art. oriented님의 블로그에서 트랙백 문제를 간단히 설명하자면, 어떤 수열이 있다. 이 수열 내에서 어떤 두 정수를 더하여, 임의의 정수 M을 만들 수 있는가? 하는 것이다. 수열은 오름차순으로 정렬되어 있다. 다음과 같은 O(N^2) 알고리즘은 쉽게 찾을 수 있을 것이다. for(front=0; front < N; ++front){ for(last=front+1;last <...... more

덧글

  • 클랴 2007/08/08 18:16 # 답글

    으음.. 양쪽에서 찾아들어가는 방법이군요. 멋져요!
  • TOWA 2007/08/08 20:46 # 답글

    어려워요[]
  • 로키 2007/08/09 01:39 # 답글

    머지 저 외계어는.....
    그냥 말로 써있으면 쉽게 이해될거 같은데......
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.