Languages/C

[C] 달팽이 배열 채우기

MOONCO 2023. 2. 22. 21:47

서문

이거 하면, 배열은 거의 마스터임

 

 

원하는 결과

 

결과 분석하기, 아이디어 찾기

[ 분석 ]
1. [0][4]에서 시작
2. 반시계 방향으로 돌기
3. 숫자 저장
4. 1칸 이동후, 숫자 1증가
5. (3)~(4) 반복

배열을 출발지점부터 'ㄱ' ,'ㄴ' 자 형식으로 잘라봤을때,
9칸 + 7칸 + 5칸 + 3칸 + 1칸 = 25칸
( 등차수열 형식, 반복문 사용가능 -2 )

0 ~ 칸수 / 2 범위는, 행이동 ( x값 변화 )
칸수 / 2 + 1 ~ 칸수 범위는, 열이동 ( y값 변화 )

행이동 + 열이동이 5번 반복됨
반복될때마다, 행이동과 열이동의 방향이 반대가 됨

[ 아이디어 ]
현재 위치를 인덱스로 저장하고,

반복문이 돌때마다 올바른 방향으로 인덱스를 바꾸자!

 

코드

void arraycross(void){
    int aList[5][5] = { 0 };
    
    // 시작 지점이 aList[0][4] 이므로, 인덱스 위치 조절
    // ( x가 4가 아닌, 5인 이유는 처음에 -1 연산을 배제하기 위해서 [0][4]부터 숫자 넣기)
    int x = 5, y = 0, nCounter = 0;
    
    // i,j : 반복문 사용하기 위한 변수, nLength : 등차수열 시작하기 위한 숫자 (반복 => 2씩 감소)
    // nDirection : 인덱스 이동 방향 선택하기 위한 숫자
    int i = 0, j = 0, nLength = 9, nDirection = 1;
    
    for(nLength = 9; nLength > 0; nLength -= 2){
    	// 'ㄱ'자 칸수만큼 반복
        for(i = 0; i < nLength; ++i){
            // 맨처음 : 0 ~ 4, 좌측으로 5번 이동
            if(i < nLength / 2 + 1) x -= nDirection;
            // x가 감소 할때, y는 증가 하므로 반대방향 선택해주기
            else                    y += nDirection;
            
            // 인덱스가 가리키는 위치에 데이터 저장
            aList[y][x] = ++nCounter;
        }
        // 'ㄱ'자 구간 종료, 시계 방향 회전하기 
        // 시계방향회전 : (-,+) => (+,-) => (-,+) 반복
        nDirection = -nDirection;
    }
    
    for(i = 0; i < 5; ++i){
        for(j = 0; j < 5; ++j){
            printf("%d\t", aList[i][j]);
        }
        putchar('\n');
    }
}

 

 
 
반응형