달팽이 배열? Programing

회사에서 컴퓨터 설치하고 프로그램 깔고 오늘은 할 일이 없어서 빈둥대다가
선배님이 달팽이 배열 안만들어 봤으면 만들어 보라구 하셔서
만들어봤다.


달팽이 배열이란

4를 입력하면

  1   2   3   4
 12  13  14   5
 11  16  15   6
 10   9   8   7

이렇게 달팽이처럼
숫자가 뱅글뱅글 돌아가는 배열을 말해요.

#include<stdio.h>

class CSnailArray
{
private :
    int m_nSize ;
    int * m_pArr ;
public :
    CSnailArray( int nSize ) ;
    ~CSnailArray( )
    {
         delete m_pArr ;
    }

    void print( )
    {
        int i = 0 ;
        while( i < m_nSize * m_nSize )
        {
            printf( "%3d ", m_pArr[i] ) ;
            if( (( i+1 ) % m_nSize) == 0 )
                printf( "\n" ) ;
            ++i ;
        }
    }
};

CSnailArray::CSnailArray( int nSize )
{
    m_nSize = nSize ;
    m_pArr = new int[nSize*nSize] ;
    int i = 0 ;
    while( i < nSize*nSize )
        m_pArr[i++] = 0 ;

    i = 1 ;

    int temp = nSize ;
    int tempLifeCycle = 1 ;// 최대사이즈는 가로로 한번만 긋는다 
    int direction = 0 ; // 0 - right, 1 - down, 2 - left, 3 - up
    int iCount = 0 ; // 한 줄에 필요한 카운트
    int increase = 1 ;
    int offset = -1 ;

    while( i <= nSize * nSize )
    {
        if( tempLifeCycle == 0 )
        {
            --temp ;
            tempLifeCycle = 2 ;
        }
  
        if( direction == 0 )
            increase = 1 ;
        else if( direction == 1 )
            increase = m_nSize ;
        else if( direction == 2 )
            increase = -1 ;
        else if( direction == 3 )
            increase = -m_nSize ;

        iCount = 0 ;
        while( iCount < temp )
        {
            offset+=increase ;
            m_pArr[offset] = i ;
            ++i ;
            ++iCount ;
        }

        --tempLifeCycle ;
        direction = (direction+1)%4 ;
    }
}

void main( )
{
    CSnailArray snArr( 10 ) ;
    snArr.print() ;
}

콘솔에서 테스트용으로 만드는 이런거.. 매우 귀찮아서.. 그래서 인라인에.. 주석도 몇개 없으니 양해바랍니다.
처음 봐서 보이는 규칙가지고는 재귀 호출을 해야할 듯 싶었는데
보고 또 보고 이리보고 저리보고 하다보니
구현 할 수 있는 방법이 내가 찾은것만 대여섯가지가 됫다.
걔중에 가장 직관적인 방법을 구현했다.(내가 찾은 선에 한에서)

대학와서 학기초에 이런 비스무리 한 것 여러개로 개인적으로 로직 훈련을 했었는데 덕분에 기억이 났습니다 ^^;
그때 몇 일동안 통학시 버스에서나 학교에서나 밥먹을때나 연습장을 끼고 다니면서
낙서해가며 풀어갔던 기억이 생생하네요^^; 그 덕분에 단 몇일만에 엄청난 로직능력 상승이 일어났었어요 ㅎㅎ
사람은 역시나 열심히 해야 능력이 오르는듯..

 


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://eve8110.egloos.com/tb/3525873 [도움말]
  • 달팽이 배열(수열?) 리팩토링 버전 2009/10/06 18:30 #

    달팽이 배열?-----------------------------------------------------------------------------------------------위 링크의 코드는 1년 10개월전 쯤 작성 했던 코드.그때 뭐 대충 작성하긴 했지만.오늘 할게없어서..(휴가중)이전 코드를 찾아 리팩토링 해봤다.하면서 기능 추가도 했고.이제 객체로서의 볼품을 갖춘 모습.(대학 과제로 자주 나오나보다 --)---------...... more

덧글

  • GENESIS™ 2008/01/05 00:57 # 답글

    저도 회사 다니면서 달팽이 만들줄 아냐고 물어보시더군요;
  • 소노반 2008/01/05 10:35 # 답글

    ㅎㅎ 검색해보니 공부할때 예제로 많이 쓰이나봐요
덧글 입력 영역