저번엔 자바 배열에 대해 알아 봤다
배열안에 배열을 또 넣을수 없을까? 라는 생각에 다차원 배열도 만들어졌다!
만드는 방법은 간단하다
정수형 이차원 배열을 만든다고 하면
int[][] array = new int[][];
이렇게 만들면 3의길이만큼 배열을 만들고
그 안에는 각각 4의 길이의 배열이 생성된거다
int[][] array = new int[3][4];
행과 열로 본다면
0 0 1 2 3
1 0 1 2 3
2 0 1 2 3
대략 이런식으로 볼수 있겠다 행과 열로 생각하면 쉽게 떠올릴수있다
다음은 배열에 값을 넣어보겠다
int cnt = 1;
우리는 배열에 1이라는값을 계속 증가 시켜서 넣어볼거다
array[0][0] = cnt;
cnt++;
array[0][1] = cnt;
cnt++;
이렇게 계속 작성하면 되지만
반복 되는것이 보이면? 반복문으로 해결해주면된다
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
array[i][j] = cnt;
cnt++;
System.out.print(array[i][j] + " ");
}
System.out.println();
}
i는 0부터 시작해서 array의 길이만큼 실행이될것이다
여기서 array의 길이는 몇일까? 바로 3이다
하지만 array[i]의 길이는 4이다.
우리는 앞서 array[3][4]라는 배열을 만들었기때문에 그대로 적용된다
이 코드를 실행해본다면
array[0][0]부터 1씩 계속 증가될거고
array[0][3]에 도달하면
array[1][0]부터 또 값이 들어갈것이다
그래서 출력문에는 array[i][j]가 들어가있다.
지그재그출력
이를 응용해서
1 2 3 4 5
10 9 8 7 6
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
위 와 같은 출력문을 만들어 보려고 한다
일단 증가하는건 알겠지만
약간의 변수가 있는거같다 두번째줄과 네번째줄에서는
뒤에서부터 증가한다 즉 인덱스의 마지막부터 증가한다는것이다
인덱스는 0부터 시작하기때문에
1,3번째 줄로 생각하면된다
인덱스가 홀수이면 뒤에서부터 증가하게 작성하면된다.
전체 코드를 보면 다음과 같다
int[][] array = new int[5][5];
int num = 1;
for (int i = 0; i < array.length; i++) {
if (i % 2 == 0) {
for (int j = 0; j < array[i].length; j++) {
array[i][j] = num;
num++;
}
} else {
for (int k = array[i].length - 1; k >= 0; k--) {
array[i][k] = num;
num++;
}
}
}
처음엔 헷갈렸는데 행과 열로 생각해보면 어디를 증가시켜야할지 감이 잡힌다
else 문에서 k = array[i].length - 1이라고 적혀있다
왜 이렇게 적혀있을까? 인덱스는 0부터 시작이기때문에 5의 길이를 가지고 있는 배열의 마지막 인덱스는 4이다
그렇기때문에 뒤에서부터 늘어나는 10 9 8 7 6 을 작성하려면
인덱스의 마지막 번호부터 실행되게끔 - 1을 한것이다.
지그재그출력2
1 10 11 20 21
2 9 12 19 22
3 8 13 18 23
4 7 14 17 24
5 6 15 16 25
이번엔 위와 같은 출력문을 나오게 해보겠다
숫자는 똑같이 증가하지만 패턴이 다르다!
이차원 배열이 있다고하면
[0][0]
[1][0]
[2][0]
[3][0]
[4][0]
이런식으로 증가하고 그 다음에는
[0][1]
[1][1]
[2][1]
[3][1]
[4][1] <- 여기서부터 증가한다 뒤의 배열이 [3]일때도 16 17 18 19 20 아래서부터 증가한다
홀수일때는 아래서 부터 증가한다는걸 알수있다
int[][] array = new int[5][5];
int num = 1;
for (int i = 0; i < array.length; i++) {
if (i % 2 == 0) {
for (int j = 0; j < array.length; j++) {
array[j][i] = num;
num++;
}
} else {
for (int k = array.length - 1; k >= 0; k--) {
array[k][i] = num;
num++;
}
}
}
이런 코드를 작성해볼수 있겠다
홀수일때는 배열의 앞부분이 인덱스의 마지막번호부터 0까지 가도록
짝수일때는 0번째부터 증가하도록
출력문은 for each를 써도 되고
그대로 for문을 써도 된다
더 보기 편하게 for each로 써보겠다
for (int[] f : array) {
for (int s : f) {
System.out.print(s + " ");
}
System.out.println();
}
배열은 주소값으로 메모리에 저장된다
따라서 이차원 배열을 제대로 이해했다면 for each로도 문제없이 작성할수 있을거라고 선생님께서 말씀해주셨다.
그래서 f 에는 배열의 앞부분인 큰 덩어리들이 담길것이고 s 에는 배열의 모든값이 하나씩 담길것이다.
int[][] array = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} } ;
이렇게 있다면 f에는 {1,2,3,4} , {5,6,7,8} 과 같은 것이 담기는거고
한 번더 변수에 담아서 하나씩 뽑아낸다고 생각하면 된다.
length를 이용해도 편하게 출력이 가능하다 하지만 더 간결하게 작성하고싶다면 for each를 써보면좋다
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + "\t");
}
System.out.println();
}
배열 쉬운듯 어렵다.. 다음엔 클래스에 대해 작성해보겠습니다!
'Java' 카테고리의 다른 글
자바 오버로딩, 생성자 (0) | 2024.04.13 |
---|---|
자바 배열 (0) | 2024.01.15 |
자바 완전수 구하기. (0) | 2024.01.09 |
자바 2438 별찍기.. (0) | 2024.01.09 |
자바 백준 2480번 (0) | 2024.01.08 |