Doit자바 알고리즘 (다차원배열)- 2

업데이트:

2차원 배열

배열을 구성 요소로 하는 것이 2차원 배열이며, 2차원 배열을 구성 요소로 하는 것이 3차원 배열이다.

이런 배열을 보통의 배열(1차원 배열)과 구분하기 위해 다차원 배열(multi0dimensional array)이라고 한다. 다차원 배열 가운데 가장 간단한 것이 2차원 배열이다.

int[][] x = new int[2][4];

2차원 배열은 가로와 세로로 “행”과 “열”이 늘어선 표와 같은 모습이다.

사실 자바는 엄밀한 의미에서 다차원 배열이 없다. 왜냐면 2차원 배열을 “배열의 배열”로 생각하고, 3차원 배열을 “배열의 배열의 배열”로 생각하기 때문이다. 따라서 배열 x의 형은 아래와 같다.

“int형을 구성 자료형으로 하는 배열” 을 구성 자료형으로 하는 배열

2차원 배열 예제

package com.practiceExample.Doit.chap02;

public class int2DArray {
  public static void main(String[] args) {
    int[][] x = new int[2][4];

    x[0][1] = 37;
    x[0][3] = 54;
    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차원 배열

3차원 배열 선언은 아래와 같다.

long y = [][][] = new long[2][3][4];

위 코드를 설명하자면 다음과 같다.

“long형을 구성 자료형으로 하는 배열을 구성 자료형으로 하는 배열”을 구성 자료형으로 하는 배열

위의 2차원 배열x와 3차원 배열y의 구성 자료형은 다음과 같다.

  • x : …“int형”을 구성 자료형으로 하는 배열
  • y : …“long형을 구성 자료형으로 하는 배열” 을 구성자료형으로 하는 배열

더이상 나눌 수 없는 요소(배열이 아닌)까지 분해하면 배열x는 int형, 배열y는 long형이다. 이런 형을 자료형(element type)이라 부르고 자료형 레벨의 구성 요소를 요소(element)라고 한다.

2차원 배열) 한 해의 경과 일 수를 계산하는 프로그램

2차원 배열을 활용하여 어떤 날짜의 “그 해의 경과 일 수”를 구해보자.

예를들어 4월 15일의 그 해의 경과 일수는 다음과 같다.

1월의 일 수 + 2월의 일 수 + 3월의 일 수 + 15

m월 d일의 그해 경과 일 수를 공식화 하면 다음과 같다.

m - 1월의 일수 합 + d

그런데 2월의 일 수는 평년은 28일, 윤년은 29일로 해에 따라 달라진다. 그래서 아래처럼 2행 12열의 2차원 배열 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

예제

package com.practiceExample.Doit.chap02;

import java.util.Scanner;

public 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 scanner = new Scanner(System.in);
    int retry;

    System.out.println("그 해 경과 일수를 구합니다.");

    do {
      System.out.println("년 : "); int year = scanner.nextInt();
      System.out.println("월 : "); int month = scanner.nextInt();
      System.out.println("일 : "); int day = scanner.nextInt();

      System.out.printf("그 해 %d일째입니다.\n", dayOfYear(year, month, day));

      System.out.println("한번 더 합니까? (1. 예/ 0.아니오) : ");
      retry = scanner.nextInt();
    } while(retry == 1);
  }
}

배열 mdays와 메서드 isLeap이 잘 조합되어 있으므로 2월의 일 수에 대해 특별한 처리가 필요하지 않다.

위 코드에서 dayOfYear의 for문은 while문으로 바꿀 수 있다.

static int dayOfYear(int y, int m, int d) {
    while(--m != 0) {
      d += mdays[isLeap(y)][m-1];
    }
    return d;
   }

다차원 배열의 내부

2행 4열 배열의 선언은 다음과 같다.

int[][] x = new int[2][4];

위 코드를 풀어쓰면 다음과 같다.

int[][] x;
x = new int[2][];
x[0] = new int[4];
x[1] = new int[4];

참고 : 배열 초기화에선 마지막에 쉼표(,)를 추가로 넣을 수 있다.

int[] a = {1, 2, 3, 4,};

다차원 배열의 복제

다차원 배열의 복제는 최상위의 1레벨만 수행한다. 다음 예에서 a[0]과 a[1]만 복제되고 그 아래 레벨의 배열은 복제되지 않고 공유된다.

KakaoTalk_20201010_195412121

댓글남기기