회사에서 컴퓨터 설치하고 프로그램 깔고 오늘은 할 일이 없어서 빈둥대다가
선배님이 달팽이 배열 안만들어 봤으면 만들어 보라구 하셔서
만들어봤다.
달팽이 배열이란
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() ;
}
콘솔에서 테스트용으로 만드는 이런거.. 매우 귀찮아서.. 그래서 인라인에.. 주석도 몇개 없으니 양해바랍니다.
처음 봐서 보이는 규칙가지고는 재귀 호출을 해야할 듯 싶었는데
보고 또 보고 이리보고 저리보고 하다보니
구현 할 수 있는 방법이 내가 찾은것만 대여섯가지가 됫다.
걔중에 가장 직관적인 방법을 구현했다.(내가 찾은 선에 한에서)
대학와서 학기초에 이런 비스무리 한 것 여러개로 개인적으로 로직 훈련을 했었는데 덕분에 기억이 났습니다 ^^;
그때 몇 일동안 통학시 버스에서나 학교에서나 밥먹을때나 연습장을 끼고 다니면서
낙서해가며 풀어갔던 기억이 생생하네요^^; 그 덕분에 단 몇일만에 엄청난 로직능력 상승이 일어났었어요 ㅎㅎ
사람은 역시나 열심히 해야 능력이 오르는듯..

덧글
GENESIS™ 2008/01/05 00:57 # 답글
저도 회사 다니면서 달팽이 만들줄 아냐고 물어보시더군요;
소노반 2008/01/05 10:35 # 답글
ㅎㅎ 검색해보니 공부할때 예제로 많이 쓰이나봐요