[ C 언어 / C ++] 달팽이 를 돌려봅시다 . 어떠 한 방법 이 든지 배열 에 모든 요소 를 방문 한다 . > 방문 횟수 = rows ( 행 ) * cols ( 열 ) > 방문 방법 은 ( 0 , 0 ) 번 요소 를 시작 으로 동 -> 남 -> 서 -> 북 하나에 싸이클 을 이룬다 . > 싸이클 이 끝 나 는 시점 은 모든 요소 를 방문 했 을 때 이 다 . > 방향 전환 시 방문 가능 한 배열 요소 에 범위 는 줄어든다 . > 초기 방문 가능 요소 의 범위 는 행 으로 는 ( 0 , n - 1 ) 열 ( 0 , n - 1 ) > 동 에서 남 으로 전환 과 서 에서 북 으로 의 전환 은 한 행이 행방 문 가능 요소 범위 에서 제외 됨 을 가르킨다 . > 남 에서 서 , 북 에서 동 으로 의 전환 은 한 열 이 방문 열 방문 가능 요소 범위 에서 제외 됨 을 가르킨다 . > 행방 문 가능 요소 범위 가 다음 과 같 을 때 ( k , m ) > 동 에서 남 으로 방향 전환 시 행의 범위 는 ( k - 1 , m ) > 서 에서 북 으로 방향 전환 시 행의 범위 는 ( k , m - 1 ) > 열 방문 가능 요소 범위 가 다음 과 같 을 때 ( i , j ) > 남 에서 서로 방향 전환 시 열 의 범위 는 ( i , j - 1 ) > 북 에서 동 으로 방향 전환 시 열 의 범위 는 ( i - 1 , 1 ) 위 문장 들 을 하나 하나 코드 로 많 들어가 죠 , , ( 밥로스 아저씨 ( 누군지 아 실려나 ? ㅋ ) 처럼 마지막 에 참 쉽 죠 라고 말 할 수 있 었 으면 ㅎㅎ ) 우선 전 달팽이 를 돌려 보 자 에서 함수 선언 까지 했 던 걸로 기억 이 나 네 요 ^^; void dalpang 2 ( int ** array , int rows , int cols , int start ) 였 는데 문제점 이 생겼 습니다 . C 언어 에서 2 차원 배열 과 이중 포인터 는 이퀄 하 지 못하 다는 거 죠 . .( 불만 이 아닐 수 없 습니다 . ㅋ ) ( 사실 C 언어 를 요즘 도통 안 하 다 보 니 까먹 고 있 었 습니다 . 이번 계기 로 다시금 새기 는 시간 이 되 었 습니다 . ) 결국 저 상태 에서 코딩 이 들어가 고 main 에서 아래 와 같이 사용 한다면 64 int array [ Y ] [ X ] ; 65 66 dalpang 2 ( array , Y , X , 3 ) ; 다음 과 같 은 error C 2664 : ' dalpang 2 ' : cannot convert parameter 1 from ' int [ 4 ] [ 7 ] ' to ' int ** ' 메세지 를 보 게 됩니다 . void dalpang 2 ( int array [ 7 ] [ 4 ] , int rows , int cols , int start ) ; void dalpang 2 ( int * array [ 4 ] , int rows , int cols , int start ) ; 위 선언 도 가능 한데 조금 불길 하 고 먼지 꺼림직 하 죠 ? 바로 달팽이 에 신체 싸이 즈 가 정해진다는 것 입니다 . 불쌍 한 달팽이 는 다이어트 나 핼 스 를 통한 근육 강화 는 무리 입니다 . 그래서 착안 한 방법 은 어느 배열 이나 1 차원 적 인 선형 구조 로 나타낼 수 있 는 게 생각 났 습니다 . . void dalpang 2 ( int * array , int rows , int cols , int start ) ; / / 실제 넘겨 줄 때 64 int array [ Y ] [ X ] ; 65 66 dalpang 2 ( array [ 0 ] , Y , X , 3 ) ; 그래서 요렇게 하 기 로 했 습니다 . 문제점 은 이 배열 에 요소 구석구석 을 방문 하 기 위해 더 이상 array [ 3 ] [ 4 ] 이런 식 으로 방문 불 가능 하 다는 거 죠 . . 그래서 array [ y * cols + x ] 이런 수식 을 쓰 기 로 했 습니다 . 한번 종이 에 끄적이 면서 음미 해 보 세요 . . 진법 비스 므리 하 네요 . . 그러면 본격 적 으로 코딩 에 진입 해 보 죠 . 자 필요 한 변수 들 을 정의 해 보 죠 . . 위 달팽이 명세서 를 보 았 을 때 배열 에 총 길이 ( 방문 횟수 ) , 행 / 열 방문 가능 범위 , 방문 함 에 방향 을 가지 기 위한 방향 성 현 x , y 의 좌표 대충 되 었 나요 ? 아 그리고 현재 진행 방향 을 나타내 는 flag 가 필요 하 겠 군요 . . 행 / 열 방문 가능 범위 에 대해서 는 위 명세서 를 잘 살펴보 시 면 아실 수 있 다 생각 이 듭니다 . 방향 성 은 우선 원점 ( 0 , 0 ) 에서 처음 동 에서 출발 해 ( 0 , n - 1 ) 에 이르 면 그 이후 부터 는 남 으로 진행 하 게 됩니다 . 동 으로 진행 할 때 는 열 번호 만 1 씩 증가 하 기 때문 에 이 를 반영 해서 int direction [ 2 ] ={ 1 , 0 } 을 사용 하 게 됩니다 . 잘 이해 가 안 가시 는 분 들 은 밑 에 코드 훌 터 보 시 다 보 면 아실 거 라 사료 되 네요 ㅎㅎ 현재 진행 방향 을 나타내 는 flag 는 동서남북 enum D { EAST = 0 , SOUTH , WEST , NORTH }; 을 사용 하 기 로 하 겠 습니다 . 전체 적 인 틀 을 보 자면 다음 과 같 습니다 . 위 명세서 내용 과 똑같 죠 ? ? 그래서 전 코딩 하 기 전 종이 에 먼저 명세 를 적 어 봅니다 . 그 자체 가 프로그래밍 이 겠 죠 ? 그 다음 은 단순 코딩 뿐 . . 01 void dalpang 2 ( int * array , int rows , int cols , int start ) { 02 03 enum D { EAST = 0 , SOUTH , WEST , NORTH }; 04 05 int length = rows * cols ; / / 방문 횟수 = rows ( 행 ) * cols ( 열 ) 06 int rangeX [ 2 ] ={ 0 , cols - 1 }; 07 int rangeY [ 2 ] ={ 0 , rows - 1 }; 08 int direction [ 2 ] ={ 1 , 0 }; 09 int x = 0 ; 10 int y = 0 ; 11 12 D flag = EAST ; 13 14 / / 어떠 한 방법 이 든지 배열 에 모든 요소 를 방문 한다 . 15 for ( int i = 0 ; i = x + direction [ 0 ] && 22 rangeY [ 0 ] = y + direction [ 1 ] ) 24 ) {// 다음 좌표 가 범위 안 에 있 지 않 는다면 ? 25 / / 방향 을 전환 하 자 26 27 switch ( flag ) { 28 29 / / 현재 진행 방향 이 무엇 이 더냐 ? 30 / / 진행 싸이클 에 따라 다음 진행 방향 을 위한 값 들 을 갱신 해 주 자 . 31 32 case EAST : 33 rangeY [ 0 ] += 1 ; 34 direction [ 0 ] = 0 ; 35 direction [ 1 ] = 1 ; 36 flag = SOUTH ; 37 break ; 38 case SOUTH : 39 rangeX [ 1 ] -= 1 ; 40 direction [ 0 ] =- 1 ; 41 direction [ 1 ] = 0 ; 42 flag = WEST ; 43 break ; 44 case WEST : 45 rangeY [ 1 ] -= 1 ; 46 direction [ 0 ] = 0 ; 47 direction [ 1 ] =- 1 ; 48 flag = NORTH ; 49 break ; 50 case NORTH : 51 rangeX [ 0 ] += 1 ; 52 direction [ 0 ] = 1 ; 53 direction [ 1 ] = 0 ; 54 flag = EAST ; 55 break ; 56 } 57 } 58 59 / / 다음 방문 좌표 를 결정 한다 . 60 61 x += direction [ 0 ] ; 62 y += direction [ 1 ] ; 63 }// end of for 64 } 자 이 코드 를 실제 돌려 보 면 요렇 습니다 . 01 # define X 702 # define Y 403 int main ( ) { 04 05 int array [ Y ] [ X ] ; 06 07 dalpang 2 ( array [ 0 ] , Y , X , 3 ) ; 08 09 for ( int i = 0 ; i < Y ; i ++){ 10 for ( int j = 0 ; j < X ; j ++){ 11 printf ( "% 3 d \ t ", array [ i ] [ j ] ) ; 12 } 13 printf ( "\ n "); 14 } 15 return 0 ; 16 } 자 이제 모두 들 돌려 보 세요 . . 이 방법 이 최고 에 알고리즘 은 아니 겠 죠 ? 다른 알고리즘 또한 있 을 걸로 생각 이 됩니다 . 각자 몫 으로 남기 고 허술 한 글 읽 어 주 셔서 감사 드리 며 저희 카페 회원 모두 는 달팽이 정도 는 문제 없이 돌리 는 회원 분 들 이 되 길 빌 어요 ★( 주 ) 아이 티 뱅크 멀티 컴퍼스 해커 대학 ( 02 - 3672 - 4095 ) ★ 무료 개인 컨설팅 은 상담 예약 을 잡 아야 가능 합니다 . . 정보 보안 전문가 과정 관리 담당 유 규정 학과 주임 ( 학주 ) 공유 하 기 글 요소