반응형

👇 공부한 자료들의 실제 소스파일들을 기록해논 공간입니다 👇
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();
}
왼쪽 회전 결과
오른쪽 회전 결과
결과는 같았지만 회전할 때의 접근이 행으로 접근해야 하는지 열로 접근해야 하는지가 달랐다
직접 풀면서 위치값을 찍어보고 변화되는 것을 연결해봤더니 어떻게 접근해야 하는지 알게 되었다!
오늘은 문제를 다 풀어서 뿌듯하다 !
반응형
'👩🏻💻 𝐋𝐚𝐧𝐠𝐮𝐚𝐠𝐞 > ⠀⠀⠀⠀ Jᴀᴠᴀ' 카테고리의 다른 글
2023/10/19💌 조별 미션 / 영단어 깨기 (1) | 2023.10.19 |
---|---|
2023/10/18👋 클래스/메소드/생성자/변수 (1) | 2023.10.18 |
2023/10/16✏️ 2차원 배열 (1) | 2023.10.18 |
2023/10/13⭐️ 미니프로젝트 완성 (0) | 2023.10.18 |
2023/10/12⭐️ JAVA Mini Project (0) | 2023.10.18 |