일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ADSL
- release
- 사이트 이동 경로
- javascript function
- 자바스크립트
- 인공지능
- Electronic Commerece
- 중요한건 꺾이지 않는 마음
- javascript
- 怕不变
- 퍼스트 뷰
- 도메인
- 배열
- 직귀율
- pop
- 내장객체
- 제어문
- 반응형 디자인
- 각자의 밤
- first view
- Great things take time
- 기술면접 후기
- 자바스크립트 함수
- bom
- 레거시 마이그레이션
- Array
- 不不怕变
- 객체
- 릴리스
- Done is better than perfect
- Today
- Total
1일1끄적
자료구조&기본 알고리즘 입문(자바)- 배열(4) 본문
○다차원 배열
배열을 구성 요소로 하는 것이 2차원 배열이며, 2차원 배열을 구성 요로소 하는 것이 3차원 배열
이런 배열을 보통의 배열(1차원 배열)과 구별하기 위해 다차원 배열(multo-dimensional array)라고 한다.
다차원 배열 가운데 간단한 것이 2차원 배열이다
int[][] x = new int[2][4]
2차원 배열 x는 가로와 세로로 '행과' '열이 늘어선 '표'와 같은 모양이라고 생각할 수 있다.
2차원 배열 안의 각 요소는 []를 이중으로 적용한 식 x[i][j]로 접근한다.
그런데 Java는 엄밀한 의미에서 다차원 배열이 없다. 2차원 배열을 '배열의 배열'로 생각하고 3차원 배열은
'배열의 배열의 배열'로 생각하기 때문이다. 따라서 배열 x의 형은 아래와 같다
'int형을 구성 자료형으로 배열'을 구성 자료형으로 하는 배열
package chap02;
// 2행 4열의 2차원 배열
class Int2DArray {
public static void main(String[] args) {
int[][] x = new int[2][4]; // 2차원 배열을 선언
x[0][1] = 37; // x[0][1]에 37을 대입
x[0][3] = 54; // x[0][3]에 54를 대입
x[1][2] = 65; // x[1][2]에 65를 대입
for (int i = 0; i < 2; i++) // 각 요소의 값을 출력
for (int j = 0; j < 4; j++)
System.out.println("x[" + i + "][" + j + "] = " + x[i][j]);
}
}
// *콘솔 출력
// x[0][0] = 0
// x[0][1] = 37
// x[0][2] = 0
// x[0][3] = 54
// x[1][0] = 0
// x[1][1] = 0
// x[1][2] = 65
// x[1][3] = 0
3차원 배열같은 경우는 하단의 예와 같다
long y[][][] = new long [2][3][4]
"long형을 구성 자료형으로 하는 배열을 구성 자료형으로 하는 배열"을 구성 자료형으로 한느 배열
○ 2차원 배열을 활용한 프로그램
한 해의 경과 일 수를 계산하는 프로그램
md월 d일의 그 해 경과 일수
1월, 2월 ...., m-1월의 일 수 의 합 +d
*2월의 일 수는 평년은 28일, 윤년은 29일로 해에 따라 달라진다. 그러므로 다음과 같이
12열의 2차원 배열 mdays에 각 달의 일수를 저장할 수 있다.
평년의 각 달의 일 수 .. mdayas[0][0], mdayas[0][1]..., mdayas[0][11]
윤년의 각 달의 일 수 .. mdays[1][0], mdays[1][1]...mdays[1][11]
static int[][] mdays = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, // 평년
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} // 윤년
};
import java.util.Scanner;
// 그 해 경과 일수를 구하기
class DayOfYear {
// 각 달의 일 수
static int[][] mdays = {
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, // 평년
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} // 윤년
};
// year년은 윤년? (윤년:1/평년:0)
static int isLeap(int year) {
return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) ? 1 : 0;
}
// y년 m월 d일의 그 해 경과 일수
static int dayOfYear(int y, int m, int d) {
int days = d; // 일 수
for (int i = 1; i < m; i++) // 1월~(m-1)월의 일 수를 더함
days += mdays[isLeap(y)][i - 1];
return days;
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
int retry; // 다시
System.out.println("그 해 경과 일 수?");
do {
System.out.print("년:"); int year = stdIn.nextInt(); // 년
System.out.print("월:"); int month = stdIn.nextInt(); // 월
System.out.print("일:"); int day = stdIn.nextInt(); // 일
System.out.printf("그 해 %d일째.\n", dayOfYear(year, month, day));
System.out.print("한번 더? (1.예/0.아니오):");
retry = stdIn.nextInt();
} while (retry == 1);
}
}
메서드 isLeap는 매개변수(year)로 전달받은 연도가 윤년이면 1을 반환하고, 평년이면 0을 반환하는 메서드.
○ 다차원 배열의 내부
2행 4열 배열의 선언은 다음과 같다
int[][] x = new int[2][4]
상단은 2차원 배열 x의 배열 변수 선완과 본체의 생성을 동시에 수행하고 있고, 배열 변수 선언과 본체 생성을 개별적으로 수행하면 다음과 같다
int[][]x;
x = new int[2][]
x[0] = new int[4];
x[1] = new int[4];
//위와 같이 4단계의 선언과 처리로 나누어 진다
1. 2차원 배열 x의 선언. in[][]형의 x는 배열 본체가 아니라 배열 변수이다
2. 배열 본체를 생성하고 , x가 그 것을 참조하도록 애입. 여기서 생성하는 배열은
=> 구성형이 자료형이 int[]형이고 구성 요솟수가 2인배열
=>새성한 배열은 x에 의해 참조되므로 각 요소에 접근하는 식은 x[0], x[1]이다. 이 배열의 구성 요솟수 2는
x. length로 얻을 수 있다
3. 배열 본체를 생성하고 x[0]이 이것을 참조하도록 대입한다. 여기서 생성하는 배열은 다음과 같다
=> 구성 자료형이 int형이고 구성 요솟수가 4인 배열
=> 생성한 배열은 x[0]에 의해 참조되므로 각 요소에 접근하는 식은 x[0][0], x[0][1], x[0][2], x[0][3]이다.
이 배열의 구성 요솟수 4는 x[0].length로 얻을 수 있다.
4. 배열 본체를 생성하고 , x[1]이 그 것을 참조하도록 대입한다. 여기서 생성하는 배열은 다음과 같다
=> 구성 자료형이 int 형이고 구성 요솟수가 4인 ㄴ배열
=> 생성한 배열은 x[1]에 의해 참조되므로 각 요소에 접근하는 식은 x[1][0], x[1][1], x[1][2], x[1][]3이다.
이 배열의 구성 요솟수 4는 x[1].length로 얻을 수 있다.
○ 확장 for문
배열을 다룰 떄는 거의 대부분 for문을 사용한다. 보통의 for문을 기본 for문 (basic for statement)이라고 한다.
또 다른 for문인 확장 for문(enhanced for statement)을 사용하면 배열의 스캔을 비교적 간단하게 구현할 수 있다.
// 배열의 모든 요소의 합을 구하여 출력 (확장 for문)
class ArraySumForIn {
public static void main(String[] args) {
double[] a = { 1.0, 2.0, 3.0, 4.0, 5.0 };
for (int i = 0; i < a.length; i++)
System.out.println("a[" + i + "] = " + a[i]);
double sum = 0; // 합계
for (double i : a)
sum += i;
System.out.println("모든 요소의 합은 " + sum );
}
}
//*콘솔 출력
//a[0] = 1.0
//a[1] = 2.0
//a[2] = 3.0
//a[3] = 4.0
//a[4] = 5.0
//모든 요소의 합은 15.0
확장 for문의 장점은 다움과 같다
- 배열의 요솟수(길이)를 조사하는 수고를 덜 수 있다
- iterator와 같은 방법으로 스캔할 수 있다. (iterator는 Java의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어 들일 때 사용)
배열의 모든 요소를 스캔하는 과정에서 인덱스 자체의 값이 필요하지 않으면 그 스캔은 확장 for문에 의해 구현하는 것이 좋다.
-출처: 자료구조와 함꼐 배우는 알고리즘 입문[자바편] 책 중
http://www.yes24.com/Product/Goods/60547893
'개발 > Java' 카테고리의 다른 글
자료구조&기본 알고리즘 입문(자바)- 검색 알고리즘, 선형 검색 (0) | 2022.01.23 |
---|---|
자료구조&기본 알고리즘 입문(자바)- 클래스 (0) | 2022.01.21 |
자료구조&기본 알고리즘 입문(자바)- 배열(3) (0) | 2022.01.03 |
자료구조&기본 알고리즘 입문(자바)- 배열(2) (0) | 2021.12.26 |
자료구조&기본 알고리즘 입문(자바)- 배열(1) (0) | 2021.12.22 |