2008년 05월 04일
배열을 위치를 90도 돌려놓기
군생활 중에도 부대 시설은 좋아서 c언어를 간간히 공부하다가 좋은 문제인 것 같아서 한번 올려봅니다.
(열혈강의 c프로그래밍중 p.435)
도전1.
4×4 int형 2차원 배열을 선언하고, 모든 요소를 아래 그림의 왼쪽에 있는 형태와 동일하게 초기화하자.
그리고 배열의 요소들을 오른쪽 방향으로 90도씩 이동시켜서 출력하는 프로그램을 작성해보자.
배열이 변경되는 형태는 다음과 같다.
1 2 3 4 13 9 5 1 16 15 14 13 4 8 12 16
5 6 7 8 14 10 6 2 12 11 10 9 3 7 11 15
9 10 11 12 → 15 11 7 3 → 8 7 6 5 → 2 6 10 14
13 14 15 16 16 12 8 4 4 3 2 1 1 5 9 13
먼저 이 것 저 것 시도해보다가 각 배열 요소들이 오른쪽으로 90도 회전했을 경우 어떻게 움직이나 다 일일이 구해봤습니다.
90도 회전 후
1(0,0) → (0,3) 5(1,0) → (0,2) 9(2,0) → (0,1) 13(3,0) → (0,0)
2(0,1) → (1,3) 6(1,1) → (1,2) 10(2,1) → (1,1) 14(3,1) → (1,0)
3(0,2) → (2,3) 7(1,2) → (2,2) 11(2,2) → (2,1) 15(3,2) → (2,0)
4(0,3) → (3,3) 8(1,3) → (3,2) 12(2,3) → (3,1) 16(3,3) → (3,0)
각 배열 요소들의 움직임을 하나하나 구하다보니 규칙성이 보입니다.(눈치채신분들은 보이시겠죠?)
각 배열들의 위치를 i,j로 놓고 (i,j)로 된다고 했을 경우
i = 0, j = 0일때
1의 경우(0,0)는 (0,3)
i = 0, j = 1일때
2의 경우(0,1)는 (1,3)
i = 0, j = 2일때
3의 경우(0,2)는 (2,3)
i = 0, j = 3일때
4의 경우(0,3)는 (3,3)
.
.
.
i = 3, j = 2 일때
15의 경우(3,2)는 (2,0)
i = 3, j =3 일때
16의 경우(3,3)는 (3,0)
각 배열요소들의 위치가
(i,j)일 경우 90도로 회전했을 때 (j,3-i)으로 바뀐다는 규칙성을 발견 할 수 있습니다.
그래서 만든 함수가
void Trans(int (*arr)[4])
{
int i,j;
int temp[4][4];
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
//printf("i : %d, j : %d\n",i,j);
//printf("arr[%d][%d] : %d\n",i,j,arr[i][j]);
temp[j][3-i] = arr[i][j];
//printf("temp[%d][%d] : %d\n",j,3-i,temp[j][3-i]);
}
}
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
arr[i][j] = temp[i][j];
}
}
}
되었습니다.
중간에 temp[4][4]를 둔 것은 arr[4][4]안에서 구하다가 중독되는 경우가 있어서 temp[4][4]를 두고 변경된 값을 저장한 arr[4][4]로 다시 복사했습니다.
제가 생각한 것 말고도 더 많은 방법들이 있다고 생각합니다.
저도 오랜시간 생각 끝에 발견한 거라 혹시나 공부하시는 분들 참고해보시라고 올립니다.
# by | 2008/05/04 09:52 | c | 트랙백 | 덧글(4)















☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
군대에서도 공부를 하다니, 열심히인걸! 잘지내?
내가 있는 곳이 시설이 좋아서 비주얼스튜디오은 돌아가는 컴퓨터들이라 깔아놓고 공부하고 있지^^
근데 오랜만에 하려니 힘들다.
노랭이군은 4학년 막바지 졸업준비에 들어갔겠는걸^^ㅋㅋ
졸업논문쓰나?
쓰고 나면 하나 줄수있나?ㅋㅋ
그리고 내가 오랜 시간끝에 발견한것을 아무렇지도 않게 말하는 것을 보니..역시 수학은 공부해야겠다는 생각이든다.ㅠㅠ
예전에 중학교 수학부터 시작하다가 포기했다는.ㅠㅠ