배열을 위치를 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)

트랙백 주소 : http://dongmy.egloos.com/tb/4334920
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 노랭이군 at 2008/05/05 02:28
2차원 배열을 다룰 때에는 (x,y) -> (y,x)로 바꾸는 것이 왼쪽 상단에서 오른쪽 하단으로 그은 대각선을 기준으로 배열을 뒤집는 변환이고, (x,y) -> (n-y, x)로 바꾸는 것이 정가운데에 선을 그어서 배열을 뒤집는 변환이라는 점을 기억하고 있으면 꽤나 편리한 듯. 그걸 이용하면 의외로 위의 변환을 바로 찾을 수 있다지.

군대에서도 공부를 하다니, 열심히인걸! 잘지내?
Commented by 가난한시인 at 2008/05/05 19:04
ㅋㅋ 잘지내고있지^^
내가 있는 곳이 시설이 좋아서 비주얼스튜디오은 돌아가는 컴퓨터들이라 깔아놓고 공부하고 있지^^
근데 오랜만에 하려니 힘들다.
노랭이군은 4학년 막바지 졸업준비에 들어갔겠는걸^^ㅋㅋ
졸업논문쓰나?
쓰고 나면 하나 줄수있나?ㅋㅋ
그리고 내가 오랜 시간끝에 발견한것을 아무렇지도 않게 말하는 것을 보니..역시 수학은 공부해야겠다는 생각이든다.ㅠㅠ
예전에 중학교 수학부터 시작하다가 포기했다는.ㅠㅠ
Commented by 노랭이군 at 2008/05/06 22:44
지금 이런 식의 '아이디어 관련 문제'들이 정보올림피아드 초등학교 쪽에서 가끔 나왔거든. 사실 회사 같은 데에서 이런 걸 할 거라고 생각치는 않지만, 그래도 기본적인 머리를 굴리는 기법이니까 연습해두면 도움은 될 듯. 고등학교/대학교 수학의 대칭이나 회전관련 책들 공부를 한 번 해보녀 더욱 되겠지만 =ㅁ= 뭐 그런 건 필요없고. 혹시나 이런 간단한 문제에 관심이 있다면 하성욱 등 저, '보기보다 쉬운 프로그래밍', 영진출판을 한 번 찾아봐. 절판되서 도서관 같은데나 있겠지만. 꽤나 좋음.
Commented by 노랭이군 at 2008/05/06 22:44
그리고 우리학교는 아쉽게 졸업논문 개념이 없어서.ㅠㅅㅠ 그래도 졸업 프로젝트라는 수업에서 논문 하나 쓰고 있으니까 되면 하나 줄게.ㅎㅎ

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶