서문
이거 하면, 배열은 거의 마스터임
원하는 결과
결과 분석하기, 아이디어 찾기
[ 분석 ]
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');
}
}
반응형