Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[1284] Re:[질문]알고리즘 관련해서..
김백일 [cedar] 1358 읽음    2002-09-27 15:53
김재구 님이 쓰신 글 :
: 숫자배열에 새로운 숫자(양수)를 추가할 경우, 인접한 세 숫자가 생기지 않을 경우에만 입력하고 싶습니다.
:
: 가령 5라는 숫자를 추가하고자할 경우, 기존배열에 4,6 이나 6,7 혹은 3,4라는 숫자가
:
: 이미 존재할 경우에는 입력을 포기하고 false를 반환하고, 없을 경우에만 숫자를 추가하고
:
: true를 반환해야합니다.

여기서 말하는 '배열'은 항상 정렬되어 있어야 한다는 얘기죠?
이런 자료구조는 배열로 구현하는 것은 좋지 않습니다.
C의 배열이나 vector, deque, list와 같은 시퀀스 컨테이너가 아니라,
항상 정렬된 상태를 유지하는 set을 사용해야 합니다.
(참고로 set은 red-black tree로 구현되어 있습니다.)

std::set을 사용한 간단한 코드를 올립니다.

//---------------------------------------------------------------------------
#include <iostream>
#pragma hdrstop
#include <set>
#include <algorithm>
#include <iterator>

//---------------------------------------------------------------------------
using namespace std;

template <typename number_type>
bool insert_unless_serial_triple(set<number_type> &s, number_type n);

#pragma argsused
int main(int argc, char* argv[])
{
    set<int> set_int;

    int in_val;
    while (cin >> in_val) {
        if (insert_unless_serial_triple(set_int, in_val)) {
            copy(set_int.begin(), set_int.end(), ostream_iterator<int>(cout, " "));
            cout << endl;
        }
    }

    return 0;
}
//---------------------------------------------------------------------------

template <typename number_type>
bool insert_unless_serial_triple(set<number_type> &s, number_type n)
{
    bool inserted;
    if (s.count(n)) inserted = false;
    else {
        bool contain_minus2 = s.count(n - 2),
             contain_minus1 = s.count(n - 1),
             contain_plus1  = s.count(n + 1),
             contain_plus2  = s.count(n + 2);
        if ((contain_minus2 && contain_minus1) ||
            (contain_minus1 && contain_plus1)  ||
            (contain_plus1  && contain_plus2))
            inserted = false;
        else {
            s.insert(n);
            inserted = true;
        }
    }
    return inserted;
}

: vector<int> Data;
:
: bool add(int val)
: {
:         vector<int>::iterator it;
:         int diff;
:         unsigned char i,Bits=0;
:         Bits = 1 << 2;
:
:         for (it=Data.begin();it < Data.end();it++)  {
:                 diff=val - *it;
:                 if (abs(diff) <3)
:                         Bits|= 1 << diff+2;
:         }
:
:         for (i=0x7;i<=0x1c;i<<=1) // 00111 01110 11100
:                 if ((Bits & i) ==i)
:                         return false;
:
:         Data.push_back(val);
:         return true;
:
: }
:
:
: 위와같이 대충 구현은 했는데, 아무리 생각해도 꽁수같네요. 좀더 일반적인 해결방법이 있을까요??

꽁수라고 말할것 까지야...
볼랜드의 VCL/CLX에 있는 Set 타입(STL의 set이 아닙니다.)은
위와 유사한 방식으로 비트 연산으로 구현되어 있습니다.
그래서 Set에 저장되는 타입은 0~255의 unsigned char만 가능하지요.

:경시대회나가는 애들 문제집을 잠깐 봤는데, 열이 팍 올라오는군요.. 요즘 애들 무서워요 -_-;;;;

무턱대고 알고리듬부터 생각하는 것보다는,
항상 자료구조를 먼저 생각한 후에 알고리듬을 고려해야 하지 않을까요?


+ -

관련 글 리스트
1282 [질문]알고리즘 관련해서.. 김재구 1325 2002/09/27
1284     Re:[질문]알고리즘 관련해서.. 김백일 1358 2002/09/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.