유리쯔의일상 2023. 10. 18. 17:27
반응형

👇 공부한 자료들의 실제 소스파일들을 기록해논 공간입니다 👇

 

 

 

 

2차원 배열과 중첩 반복문

너무 어렵다. 알고리즘과 비슷한 맥락이고 수학적인 부분이 들어가는 거라 그런지 너무 어렵다

문제를 풀면 풀수록 어렵게 느껴지는데 이 어려움을 견뎌내야 되겠지!

다시 열심히 공부하자는 마음을 다잡고 문제를 풀어본다 

 

 

 

 


 

 

문제 1

a 의 배열을 변경하라 , 한 칸씩 옆으로 위아래로 이동 

 

7 1 2 3 4 5
13 14 8 9 10 6
19 20 16 15 11 12
25 21 22 23 17 18
26 27 28 29 30 24

 

이 형태로 출력하면 된다.

 

 

나의 풀이 

        int[][] a = {{1, 2, 3, 4, 5, 6},
                {7, 8, 9, 10, 11, 12},
                {13, 14, 15, 16, 17, 18},
                {19, 20, 21, 22, 23, 24},
                {25, 26, 27, 28, 29, 30}};

        int[][] aa = new int[5][6];
        int cnt = 0;
        for (int i = 0; i < 5; i++) {
            switch (i){
                case 0 :   // i = 0
                    for (int j = 0; j < 6; j++) {
                        if (j == 0 ) aa[i][j] = a[i + 1][j];
                        if (j + 1 <= 5) aa[i][j+1] = a[i][j];
                        else break;
                    }
                    for (int j = 5; cnt+1 <=4;cnt++) {
                        aa[cnt+1][j] = a[cnt][j];
                    }
                    cnt=0;
                    break;
                case 1 : // i = 1
                    for (int j = 0; j < 4; j++) {
                        if ( j == 0 ) aa[i][j] = a[i+1][j];
                        else if ( j == 1 ) aa[i][j] = a[i+1][j];
                        aa[i][j+1] = a[i][j];
                    }
                    for (int j = 4; cnt+1<=4;cnt++) {
                        aa[cnt+1][j] = a[cnt][j];
                    }
                    cnt=0;
                    break;
                case 2 : // i = 2
                    for (int j = 0; j < 4; j++) {
                        if (j < 2) aa[i][j] = a[i+1][j];
                        else if ( j < 3 ) aa[i][j+1] = a[i][j];
                        else aa[i][j-1] = a[i][j];
                    }
                    break;
                case 3 : // i = 3
                    for (int j = 2; j < 5; j++) {
                        aa[i][j-1] = a[i][j];
                    }
                    break;
                case 4 :
                    for (int j = 5; j >= 0 ; j--) {
                        if ( j > 0) aa[i][j-1] = a[i][j];
                        else aa[i-1][j] = a[i][j];
                    }
                    break;

            }
        }

        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 6; j++) {
                System.out.print(aa[i][j] + "\t");
            }
            System.out.println();
        }
쌤의 풀이

//        int[][] a = {{1, 2, 3, 4, 5, 6},
//                {7, 8, 9, 10, 11, 12},
//                {13, 14, 15, 16, 17, 18},
//                {19, 20, 21, 22, 23, 24},
//                {25, 26, 27, 28, 29, 30}};

        int [][] a = new int[5][6];
        int cnt = 0;

        for ( int i = 0; i<3; i++ ) {
            for ( int j = 1+i; j<6-i; j++ ) { // Case1 직선부분
                cnt++;
                a[i][j] = cnt;
                a[4-i][5-j] = 31-cnt; // (4,5) 평행이동후 원점대칭
            }
            for ( int j = 5-i; j<6 && i<=1; j++ ) { // Case2 직선부분끝쪽에서 행이 1씩증가하는부븐 ( 오른쪽 )
                cnt++;
                a[i+1][j] = cnt;
                a[3-i][5-j] = 31-cnt; // (4,5) 평행이동후 원점대칭
            }
            for ( int j = 5; j<6+i && i<=1; j++) { // Case3 직선부분끝쪽에서 행이 1씩증가하는부분 ( 왼쪽 )
                cnt++;
                a[i][j-5] = cnt;
                a[4-i][10-j] = 31-cnt; // (4,5) 평행이동후 원점대칭
            }

        }

        for ( int i = 0; i<5; i++ ) {
            for ( int j = 0; j<6; j++ ) {
                System.out.print(a[i][j]+"\t");
            }
            System.out.println();
        }

출력 결과

 


 

문제 2

테트리스를 회전시켜라 !

사실 이 문제는 처음에 조금 다르게 풀었다.

인덱스 별로 접근하여 1로 된 부분을 0으로 바꾸고

0 으로 된 부분을 1로 바꾸었다.

사실 그렇게 하면 간단하지만 선생님이 요구한 회전이라는 개념이 아니었다.

그래서 다시 풀었다.

 

        int[][] tempArr = {
                            { 1, 1, 0},
                            { 0, 1, 0},
                            { 0, 1, 1}};

        // 오른쪽 회전
//        for (int i = 0; i < 3; i++) {
//            for (int j = 0; j < 3; j++) {
//                if (i == 0) nowBlock[j][2] = tempArr[i][j];
//                if (i == 1) nowBlock[j][i] = tempArr[i][j];
//                if (i == 2) nowBlock[j][0] = tempArr[i][j];
//
//            }
//        }


        // 왼쪽 회전
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if ( j == 0) nowBlock[2][i] = tempArr[i][j];
                if ( j == 1) nowBlock[1][i] = tempArr[i][j];
                if ( j == 2) nowBlock[0][i] = tempArr[i][j];
            }
        }



        // 출력
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(nowBlock[i][j] + "\t");
            }
            System.out.println();
        }

왼쪽 회전 결과 

오른쪽 회전 결과

결과는 같았지만 회전할 때의 접근이 행으로 접근해야 하는지 열로 접근해야 하는지가 달랐다

직접 풀면서 위치값을 찍어보고 변화되는 것을 연결해봤더니 어떻게 접근해야 하는지 알게 되었다!

오늘은 문제를 다 풀어서 뿌듯하다 !

반응형