Sunday, December 18, 2016

Bab 7. Java Teori dan Implementasi




Bab. 7 Array Dua Dimensi





7.1 Introduksi

Pada bab sebelumnya, Anda telah dikenalkan tentang bagaimana menggunakan array satu dimensi untuk menyimpan sekoleksi elemen. Sekarang, saatnya Anda dikenalkan bagaimana menggunakan array dua dimensi untuk menyimpan suatu matriks atau suatu tabel.


7.2 Dasar Array Dua Dimensi
Bagaimana Anda mendeklarasikan suatu variabel untuk array dua dimensi? Bagaimana Anda menciptakan suatu array dua dimensi? Bagaimana Anda mengakses elemen-elemen di dalam suatu array dua dimensi? Bagian ini akan membahas masalah-masalah ini.


7.2.1 Mendeklarasikan Variabel  Untuk Array Dua Dimensi dan Menciptakan Array Dua Dimensi
Ini adalah sintaks untuk mendeklarasikan suatu array dua dimensi:

tipeElemen[][] varRefArray;

atau

tipeElemen varRefArray[][]; // diijinkan, tetapi kurang disukai

Sebagai suatu contoh, berikut adalah bagaimana Anda mendeklarasikan suatu variabel array dua dimensi, matrix, yang memuat nilai-nilai int:

int[][] matrix;

atau

int matrix[][];      // gaya ini diijinkan, tapi kurang disukai

Anda dapat menciptakan suatu array dua dimensi yang memuat 5 x 5 nilai-nilai int dan menugaskannya kepada matrix menggunakan sintaks:

matrix = new int[5][5];

Dua subskript digunakan dalam suatu array dua dimensi, satu untuk baris dan yang lain untuk kolom. Sama seperti pada array satu dimensi, tipe untuk tiap indeks adalah int dan dimulai dari 0, seperti tertampil pada Gambar 7.1a.

Untuk menugaskan nilai 7 kepada elemen pada baris 2 dan kolom 1, seperti tertampil pada Gambar 7.1b, Anda bisa menggunakan statemen berikut ini:

matrix[2][1] = 7;

  

Gambar 7.1 Indeks tiap subskript dari suatu array dua dimensi bertipe int, mulai dari 0.

Anda juga bisa menggunakan suatu penginisialisasi array untuk mendeklarasikan, menciptakan, dan menginisialisasi suatu array dua dimensi. Sebagai contoh, kode pada (a) menciptakan suatu array dengan nilai-nilai inisial, seperti tertampil pada Gambar 7.1c. Kode pada (a) ekivalen dengan kode pada (c).



7.2.2 Mendapatkan Panjang Array Dua Dimensi 
Suatu array dua dimensi sebenarnya merupakan suatu array dimana di dalamnya setiap elemen merupakan suatu array satu dimensi. Panjang suatu array x adalah jumlah elemen di dalam array, yang bisa didapatkan dengan x.length. Sedangkan x[0], x[1], ..., dan x[x.length-1] sendiri masing-masing adalah array. Panjang masing-masing array tersebut adalah x[0].length, x[1].length, ..., dan x[x.length-1].length.

Sebagai contoh, diberikan suatu array dua dimensi x = new int[3][4]. Maka x[0], x[1], dan x[2] adalah array-array satu dimensi dan masing-masing memuat empat elemen, seperti yang ditunjukkan pada Gambar 7.2. Oleh karena itu, x.length adalah 3, dan x[0].length, x[1].length, dan x[2].length masing-masing adalah 4.



Gambar 7.2 Suatu array dua dimensi merupakan array satu dimensi dimana setiap elemennya adalah array satu dimensi yang lain.


7.2.3 Array Dengan Baris Berbeda Panjang 
Setiap baris dalam suatu array dua dimensi merupakan suatu array satu dimensi. Jadi, setiap baris di dalam array dua dimensi dapat memiliki panjang yang berbeda-beda. Berikut adalah ilustrasi dari konsep ini:


 Seperti yang Anda bisa lihat, arraySegitiga[0].length adalah 5, arraySegitiga[1].length adalah 4, arraySegitiga[2].length adalah 3, arraySegitiga[3].length adalah 2, dan arraySegitiga[4].length adalah 1.

Anda bisa menciptakan array yang memiliki baris berbeda panjang menggunakan sintaks berikut ini:

int[][] arraySegitiga = new int[5][];
arraySegitiga[0] = new int[5];
arraySegitiga[1] = new int[4];
arraySegitiga[2] = new int[3];
arraySegitiga[3] = new int[2];
arraySegitiga[4] = new int[1];

Kemudian Anda bisa menugaskan nilai-nilai kepada array tersebut. Sebagai contoh,

arraySegitiga [0][3] = 50;
arraySegitiga [4][0] = 45;


7.3 Memproses Array Dua Dimensi 
Dimisalkan dimiliki suatu array dua dimensi matrix yang diciptakan sebagai berikut:

int[][] matrix = new int[10][10];

Berikut adalah beberapa contoh pemrosesan array dua dimensi:
1.     Loop berikut ini menginisialisasi suatu array dua dimensi dengan masukan dari pengguna:

java.util.Scanner masukan = new Scanner(System.in);
System.out.println("Masukkan " + matrix.length + " baris dan " +
matrix[0].length + " kolom: ");

for (int baris = 0; baris < ; baris++) {
  for (int kolom = 0; kolom < ; kolom++) {
    matrix[baris][kolom] = masukan.nextInt();
  }
}

2.     Loop berikut ini menginisialisasi array dengan nilai-nilai acak dengan rentang 0 sampai 99:

for (int baris = 0; baris < matrix.length; baris++) {
  for (int kolom = 0; kolom < matrix[baris].length; kolom++) {
    matrix[baris][kolom] = (int)(Math.random() * 100);
  }
}

3.     Untuk menampilkan suatu array dua dimensi, Anda harus menampilkannya elemen demi elemen di dalam array menggunakan suatu loop berikut ini:

for (int baris = 0; baris < matrix.length ; baris++) {
  for (int kolom = 0; kolom < matrix[baris].length; kolom++) {
    System.out.print(matrix[baris][ kolom] + " ");
  }
 
  System.out.println();
}

4.     Gunakan suatu variabel bernama total untuk menyimpan penjumlahan semua elemen suatu array dua dimensi. Awalnya, total ditetapkan 0. Tambahkan setiap elemen di dalam array kepada total menggunakan suatu loop seperti ini:

int total = 0;
for (int baris = 0; baris < matrix.length; baris++) {
  for (int kolom = 0; kolom < matrix[row].length; kolom++) {
    total += matrix[baris][ kolom];
  }
}

5.   Untuk setiap kolom, gunakan suatu variabel bernama total untuk menyimpan penjumlahan semua elemen kolom suatu array dua dimensi. Awalnya, total ditetapkan 0. Tambahkan setiap elemen kolom di dalam array kepada total menggunakan suatu loop seperti ini:

for (int kolom = 0; kolom < matrix[0].length; kolom++) {
  int total = 0;
  for (int baris = 0; baris < matrix.length; baris++)
    total += matrix[baris][ kolom];
  System.out.println("Penjumlahan semua elemen kolom " + kolom + " = " +
   total);
}

6.     Gunakan variabel-variabel maxBaris dan indeksMaxBaris untuk menjejak penjumlahan elemen baris terbesar dan indeks barisnya. Untuk setiap baris, hitung penjumlahannya dan perbarui maxBaris dan indeksMaxBaris bila ditemukan penjumlahan elemen baris yang lebih besar.

int maxBaris = 0;
int indeksMaxBaris = 0;

// mendapatkan jumlah elemen baris pertama dalam maxBaris
for (int kolom = 0; kolom < matrix[0].length; kolom++) {
  maxBaris += matrix[0][ kolom];
}

for (int baris = 1; baris < matrix.length; baris++) {
  int totalBarisIni = 0;
  for (int kolom = 0; kolom < matrix[baris].length; kolom++)
    totalBarisIni += matrix[baris][ kolom];
  if (totalBarisIni > maxBaris) {
    maxBaris = totalBarisIni;
    indeksMaxBaris = baris;
  }
}

System.out.println("Baris " + indeksMaxBaris
+ " memiliki penjumlahan maksimum = " + maxBaris);

7.     Pengacakan elemen di dalam array satu dimensi dapat dilakukan pada array dua dimensi. Dalam melakukannya, untuk setiap elemen matrix[i][j], secara acak dibangkitkan indeks i1 dan j1 dan kemudian matrix[i][j] ditukar dengan matrix[i1][j1], sebagai berikut:

for (int i = 0; i < matrix.length; i++) {
  for (int j = 0; j < matrix[i].length; j++) {
    int i1 = (int)(Math.random() * matrix.length);
    int j1 = (int)(Math.random() * matrix[i].length);

    // Menukar matrix[i][j] dengan matrix[i1][j1]
    int temp = matrix[i][j];
    matrix[i][j] = matrix[i1][j1];
    matrix[i1][j1] = temp;
  }
}


7.4 Melewatkan Array Dua Dimensi  Kepada Metode
Anda bisa melewatkan suatu array dua dimensi kepada suatu metode sama seperti ketika Anda melewatkan suatu array satu dimensi kepada suatu metode. Kode7.1 memberikan suatu contoh dimana suatu metode memberikan nilai balik berupa penjumlahan semua elemen di dalam suatu matriks.

Kode7.1 MelewatkanArrayDuaDimensi.java

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
import java.util.Scanner;

public class MelewatkanArrayDuaDimensi {
  public static void main(String[] args) {
    // Menciptakan Scanner
    Scanner masukan = new Scanner(System.in);

    // Masukkan nilai-nilai array
    int[][] m = new int[3][4];
    System.out.println("Masukkan " + m.length + " baris dan "
    + m[0].length + " kolom: ");
    for (int i = 0; i < m.length; i++)
    for (int j = 0; j < m[i].length; j++)
      m[i][j] = masukan.nextInt();

    // Tampilkan hasil
    System.out.println("\nPenjumlahan semua elemen adalah " +jum(m) );
  }

  public static int jum(int[][] m) {
   int total = 0;
   for (int baris = 0; baris < m.length; baris++) {
     for (int kolom = 0; kolom < m[baris].length; kolom++) {
       total += m[baris][kolom];
     }
   }

   return total;
  }
}

Keluaran

Masukkan 3 baris dan 4 kolom:
3 4 5 6
2 3 4 5
6 7 8 9

Penjumlahan semua elemen matriks adalah 62

Metode jum pada baris 20 memiliki suatu argumen array dua dimensi. Anda bisa mendapatkan jumlah baris menggunakan m.length pada baris 22 dan jumlah kolom pada baris tertentu menggunakan m[baris].length (baris 23).


7.5 Masalah: Ujian Pilihan Berganda
Tantangan di sini adalah menulis suatu program yang bisa menilai ujian pilihan berganda. Dimisalkan terdapat delapan siswa dan sepuluh pertanyaan, dan semua jawaban disimpan dalam suatu array dua dimensi. Setiap baris merekam semua jawaban seorang siswa terhadap pertanyaan yang diberikan, seperti yang ditunjukkan pada array berikut ini:

              Jawaban Siswa Terhadap Pertanyaan:
              0  1  2  3  4  5  6  7  8  9
Siswa 0       A  B  A  C  C  D  E  E  A  D
Siswa 1       D  B  A  B  C  A  E  E  A  D
Siswa 2       E  D  D  A  C  B  E  E  A  D
Siswa 3       C  B  A  E  D  C  E  E  A  D
Siswa 4       A  B  D  C  C  D  E  E  A  D
Siswa 5       B  B  E  C  C  D  E  E  A  D
Siswa 6       B  B  A  C  C  D  E  E  A  D
Siswa 7       E  B  E  C  C  D  E  E  A  D

Kunci jawaban disimpan dalam suatu array satu dimensi, sebagai berikut:

Kunci Jawaban:
       0  1  2  3  4  5  6  7  8  9
Kunci D  B  D  C  C  D  A  E  A  D
Program Anda diharapkan bisa menilai ujian dan menampilkan hasil. Program harus membandingkan setiap jawaban siswa dengan kunci jawaban, menghitung berapa jawaban yang benar, dan menampilkan hasilnya. Program pada kode7.2 merupakan salah satu solusi yang diberikan.


Kode7.2 NilaiUjian.java

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
31
public class NilaiUjian {
  /** Metode Utama */
  public static void main(String[] args) {
    // Jawaban semua siswa terhadap semua pertanyaan
    char[][] jawaban = {
       {'A', 'B', 'A', 'C', 'C', 'D', 'E', 'E', 'A', 'D'},
       {'D', 'B', 'A', 'B', 'C', 'A', 'E', 'E', 'A', 'D'},
       {'E', 'D', 'D', 'A', 'C', 'B', 'E', 'E', 'A', 'D'},
       {'C', 'B', 'A', 'E', 'D', 'C', 'E', 'E', 'A', 'D'},
       {'A', 'B', 'D', 'C', 'C', 'D', 'E', 'E', 'A', 'D'},
       {'B', 'B', 'A', 'C', 'C', 'D', 'E', 'E', 'A', 'D'},
       {'B', 'B', 'E', 'C', 'C', 'D', 'E', 'E', 'A', 'D'},
       {'E', 'B', 'E', 'C', 'C', 'D', 'E', 'E', 'A', 'D'}};

    // Kunci jawaban
    char[] kunci = {'D', 'B', 'D', 'C', 'C', 'D', 'A', 'E', 'A', 'D'};

    // Nilai semua jawaban
    for (int i = 0; i < jawaban.length; i++) {
      // Nilai jawaban tiap siswa
      int jumlahBenar = 0;
      for (int j = 0; j < jawaban[i].length; j++) {
        if(jawaban[i][j] == kunci[j] )
        jumlahBenar++;
      }

      System.out.println("Jawaban siswa " + i + " memiliki jawaban benar
      sebanyak " + jumlahBenar);
    }
  }
}

Keluaran

Jawaban siswa 0 memiliki jawaban benar sebanyak 7
Jawaban siswa 1 memiliki jawaban benar sebanyak 6
Jawaban siswa 2 memiliki jawaban benar sebanyak 5
Jawaban siswa 3 memiliki jawaban benar sebanyak 4
Jawaban siswa 4 memiliki jawaban benar sebanyak 8
Jawaban siswa 5 memiliki jawaban benar sebanyak 7
Jawaban siswa 6 memiliki jawaban benar sebanyak 7
Jawaban siswa 7 memiliki jawaban benar sebanyak 7

Statemen-statemen pada baris 5-13 mendeklarasikan, menciptakan, dan menginisialisasi suatu array dua dimensi yang memuat karakter-karakter dan menugaskan referensi kepada jawaban dengan tipe char[ ][ ].
Statemen pada baris 16 mendeklarasikan, menciptakan, dan menginisialisasi suatu array yang memuat nilai-nilai char dan menugaskan referensi kunci denga tipe char[ ].

Setiap baris pada array jawaban memuat seluruh jawaban seorang siswa, yang dinilai dengan membandingkannya dengan kunci jawaban dalam array kunci. Hasilnya langsung ditampilkan setelah penilaian selesai dilakukan.


7.6 Masalah: Menemukan Pasangan Terdekat
Sistem navigasi GPS (global positioning system) menjadi semakin populer dewasa ini. Sistem ini menggunakan algoritma graf dan geometrik untuk menghitung jarak dan memetakan suatu rute. Bagian ini akan menyajikan pada Anda suatu masalah geometrik untuk menemukan suatu pasangan titik terdekat.

Gambar 7.3 Titik-titik dapat direpresentasikan dalam suatu array dua dimensi

Diberikan sehimpunan pasangan titik, tantangannya adalah bagaimana menemukan dua pasangan titik yang paling dekat satu sama lain. Pada Gambar 7.3, pasangan titik (1, 1) dan (2, 0.5) merupakan yang paling dekat satu sama lain. Ada beberapa cara untuk menyelesaikan masalah. Pendekatan yang paling klasik adalah dengan menghitung jarak di antara semua pasangan titik dan menemukan pasangan yang memiliki jarak minimum, seperti yang diimplementasikan pada kode7.3:

Kode7.3 TemukanTitikTerdekat.java

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.Scanner;

public class TemukanTitikTerdekat {
  public static void main(String[] args) {
    Scanner masukan = new Scanner(System.in);
    System.out.print("Masukkan jumlah titik: ");
    int jumlahTitik = masukan.nextInt();

    // Menciptakan suatu array untuk menyimpan titik-titik
    double[][] titik2 = new double[jumlahTitik][2];
    System.out.print("Masukkan " + jumlahTitik + " titik: ");
    for (int i = 0; i < titik2.length; i++) {
      titik2[i][0] = masukan.nextDouble();
      titik2[i][1] = masukan.nextDouble();
    }

    // p1 dan p2 adalah indeks array titik2
    int p1 = 0, p2 = 1; // Inisialisasi dua titik
    double jarakTerdekat = jarak(titik2[p1][0], titik2[p1][1],
    titik2[p2][0], titik2[p2][1]);// Inisialisasi jarakTerdekat

    // Menghitung jarak untuk setiap dua titik
    for (int i = 0; i < titik2.length; i++) {
      for (int j = i + 1; j < titik2.length; j++) {
        double jarak = jarak(titik2[i][0], titik2[i][1],
        titik2[j][0], titik2[j][1]); // Mencari jarak

        if (jarakTerdekat > jarak) {
          p1 = i; // Memperbarui p1
          p2 = j; // Memperbarui p2
          jarakTerdekat = jarak; // Memperbarui jarakTerdekat
        }
      }
    }

    // Menampilkan hasil
    System.out.println("Dua titik terdekat adalah " +
    "(" + titik2[p1][0] + ", " + titik2[p1][1] + ") dan (" +
    titik2[p2][0] + ", " + titik2[p2][1] + ")");
  }

  /** Menghitung jarak antara dua titik (x1, y1) dan (x2, y2)*/
  public static double jarak(
    double x1, double y1, double x2, double y2) {
  return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
  }
}

Keluaran

Masukkan jumlah titik: 8
Masukkan 8 titik: -1 3 4 5 7 -0.7 4 3 4 6 8 7 8 9 3 0.1
Dua titik terdekat adalah (4.0, 5.0) dan (4.0, 6.0)

Program meminta pengguna untuk memasukkan jumlah titik (baris 6-7). Titik-titik dibaca dari konsol dan disimpan dalam suatu array dua dimensi bernama titik2 (baris 12-15). Program menggunakan variabel jarakTerdekat (baris 19) untuk menyimpan jarak antara dua titik terdekat, indeks dari dua titik tersebut dalam array titik2 disimpan dalam p1 dan p2 (baris 18).

Untuk setiap titik pada indeks i, program menghitung jarak antara titik2[i] dan titik2[j] untuk semua j > i (baris 23-24). Kapan saja jarak yang lebih pendek ditemukan, variabel jarakTerdekat, p1, dan p2 diperbarui (baris 28-32).

Jarak antar dua titik (x1, y1) dan (x2, y2) dapat dihitung menggunakan formula  pada baris 43 - 46. Program mengasumsikan bahwa bidang memiliki paling sedikit dua titik. Anda dapat dengan mudah memodifikasi program untuk menangani kasus bila bidang hanya memiliki satu titik atau tidak memiliki satupun titik.


7.7 Masalah: Permainan Sudoku
Pada bagian ini akan disajikan permainan angka Sudoku, suatu permainan teka-teki untuk menempatkan angka-angka pada bidang dua dimensi. Sudoku merupakan suatu grid 9 x 9, yang dibagi menjadi kotak-kotak 3 x 3 (yang disebut dengan blok), seperti yang ditampilkan pada Gambar 7.4a. Tujuan permainan di sini adalah bagaimana agar setiap baris, setiap kolom, dan setiap blok 3 x 3 memuat angka 1 sampai 9, seperti yang ditunjukkan pada Gambar 7.4b.

Gambar 7.4 Teka-teki Sudoku pada (a) diselesaikan pada (b)

Demi kemudahan pemrograman, digunakan nilai awal 0 pada sel-sel bebas (kosong), yang ditampilkan pada Gambar 7.5a. Grid Sudoku akan direpresentasikan oleh suatu array dua dimensi, seperti tertampil pada Gambar 7.5b.

Gambar 7.5 Suatu grid dapat direpresentasikan menggunakan suatu array dua dimensi

Untuk menemukan solusi dari teka-teki Sudoku, Anda harus mengganti setiap elemen yang bernilai 0 dengan suatu angka yang cocok sehingga sesuai dengan tujuan permainan. Untuk solusi pada Gambar 7.4b, grid yang disusun dalam suatu array dua dimensi ditampilkan pada Gambar 7.6.

Gambar 7.6 Solusi disimpan dalam suatu grid.

Suatu versi tersimplifikasi dari masalah Sudoku adalah memeriksa validitas suatu solusi. Program pada kode7.4 meminta pengguna untuk memasukkan suatu solusi dan melaporkan apakah solusi valid atau tidak.

Kode7.4 PeriksaSolusiSudoku.java

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import java.util.Scanner;

public class PeriksaSolusiSudoku {
  public static void main(String[] args) {
    // Membaca suatu solusi Sudoku
    int[][] grid = bacaSolusi();

    System.out.println( apaValid(grid)? "Solusi valid" :
    "Solusi tidak valid");
  }

  /** Membaca solusi Sudoku dari konsol */
  public static int[][] bacaSolusi() {
    // Menciptakan Scanner
    Scanner masukan = new Scanner(System.in);
   
    System.out.println("Masukkan solusi teka-teki Sudoku:");
    int[][] grid = new int[9][9];
    for (int i = 0; i < 9; i++)
      for (int j = 0; j < 9; j++)
        grid[i][j] = masukan.nextInt();

    return grid;
  }

  /** Memeriksa apakah solusi valid */
  public static boolean apaValid(int[][] grid) {
    // Memeriksa apakah setiap baris memiliki angka 1 sampai 9
    for (int i = 0; i < 9; i++)
      if(!apa1Ke9(grid[i])) // Jika grid[i] tidak memuat 1 sampai 9
        return false;

    // Memeriksa apakah setiap kolom memiliki angka 1 sampai 9
    for (int j = 0; j < 9; j++) {
      // Mendapatkan satu kolom dalam array satu dimensi
      int[] kolom = new int[9];
      for (int i = 0; i < 9; i++) {
        kolom[i] = grid[i][j];
      }

      if(!apa1Ke9(kolom)) // Jika kolom tidak memuat 1 sampai 9
        return false;
    }

    // Memeriksa apakah kotak 3 x 3 memiliki 1 sampai 9
    for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
        // Elemen awal dalam kotak 3 x 3
        int k = 0;
        int[] daftar = new int[9]; // Menempatkan semua angka dalam kotak ke daftar
        for (int baris = i * 3; baris < i * 3 + 3; baris++)
          for (int kolom = j * 3; kolom < j * 3 + 3; kolom++)
            daftar[k++] = grid[baris][kolom];

        if(!apa1Ke9(daftar) ) // Jika daftar tidak memuat angka 1 sampai 9
          return false;
      }
    }

    return true; // Sel-sel valid
  }

 /** Memeriksa apakah array satu dimensi memuat angka 1 sampai 9 */
  public static boolean apa1Ke9(int[] daftar) {
    // Membuat suatu salinan dari array
    int[] temp = new int[daftar.length];
    System.arraycopy(daftar, 0, temp, 0, daftar.length);

    // Mengurutkan array
    java.util.Arrays.sort(temp);

    // Memeriksai apakah daftar memuat 1, 2, 3, ..., 9
    for (int i = 0; i < 9; i++)
      if (temp[i] != i + 1)
        return false;

    return true; // Daftar memuat 1 sampai 9
   }
}

Keluaran

Masukkan solusi teka-teki Sudoku:
6 4 2 5 9 8 1 7 3
3 1 7 2 4 6 9 8 5
5 8 9 7 1 3 4 6 2
7 3 5 9 6 1 8 2 4
4 9 6 8 5 2 3 1 7
8 2 1 4 3 7 5 9 6
2 5 4 6 8 9 7 3 1
1 7 8 3 2 5 6 4 9
9 6 3 1 7 4 2 5 8
Solusi valid

Masukkan solusi teka-teki Sudoku:
1 4 2 5 9 8 1 7 3
3 1 7 2 4 6 9 8 5
5 8 9 7 1 3 4 6 2
7 3 5 9 6 1 8 2 4
4 9 6 0 5 2 3 1 7
8 2 1 4 3 7 5 9 6
2 5 4 6 1 9 7 3 1
1 7 8 3 2 5 6 4 9
9 6 3 1 7 4 2 5 3
Solusi tidak valid


Program memanggil metode bacaSolusi (baris 6) untuk membaca suatu solusi Sudoku dari konsol dan memberikan nilai balik berupa suatu array dua dimensi yang merepresentasikan suatu grid Sudoku.

Metode apaValid(grid) (baris 27-61) memeriksa apakah setiap baris memuat angka 1 sampai 9 (baris 29-31). Variabel grid merupakan suatu array dua dimensi. grid[i] adalah suatu array satu dimensi untuk baris ke-i. Memanggil apa1Ke9(grid[i]) menghasilkan nilai balik true bila baris grid[i] memuat angka 1 sampai 9 (baris 30).

Untuk memeriksa apakah setiap kolom di dalam grid memiliki angka 1 sampai 9, maka kolom ditempatkan pada suatu array satu dimensi (baris 36-39) dan memanggil apa1Ke9 menghasilkan nilai balik true bila kolom grid[i][j] memuat angka 1 sampai 9 (baris 41).

Untuk memeriksa apakah setiap blok 3 x 3 di dalam grid memiliki angka 1 sampai 9, maka setiap kotak ditata dalam suatu array satu dimensi (baris 49-53) dan memanggil apa1Ke9 menghasilkan nilai balik true bila setiap kotak memuat angka 1 sampai 9 (baris 55).

Bagaimana Anda mencari lokasi blok-blok dalam grid Sudoku? Blok-blok tersebut berada dalam posisi (3i, 3j) untuk i = 0, 1, 2, dan j = 0, 1, 2, seperti diilustrasikan pada Gambar 7.7.

Gambar 7.7 Lokasi awal setiap kotak 3 x 3 dalam grid Sudoku.

Dengan pengamatan ini, Anda pasti dengan mudah bisa mengidentifikasi semua sel di dalam blok. Dimisalkan bahwa grid[r][c] adalah adalah sel awal dalam suatu blok 3 x 3, maka sel-sel dalam blok tersebut dapat diidentifikasi dengan

// Mendapatkan semua sel di dalam kotak 3 x 3, mulai dari grid[r][c]
for (int baris = r; baris < r + 3; baris++)
  for (int kolom = c; kolom < c + 3; kolom++)
    // grid[baris][kolom] berada di dalam kotak

Semua angka di dalam suatu blok dikumpulkan di dalam suatu array satu dimensi daftar (baris 53), dan kemudian metode apa1Ke9 dipanggil untuk memeriksa apakah semua angka 1 sampai9 berada dalam kotak tersebut.


7.8 Array Multi Dimensi
Cara mendeklarasikan dan menciptakan suatu variabel array dua dimensi dapat digeneralisir untuk mendeklarasikan suatu variabel array n dimensi, dimana n >= 3. Sebagai contoh, sintaks berikut ini mendeklarasikan suatu variabel array 3 dimensi skor, menciptakan, dan menugaskan referensinya kepada skor:

double[][][] skor = new double[10][24][2];

Suatu array multi dimensi merupakan suatu array dimana elemen-elemennya adalah array juga. Suatu array tiga dimensi memuat suatu array yang beranggotakan array-array dua dimensi, dimana tiap array dua dimensi tersebut merupakan suatu array yang beranggotakan array-array satu dimensi. Sebagai contoh, diberikan x = new int[2][2][5], maka bisa didefinisikan bahwa x[0] dan x[1] adalah masing-masing array dua dimensi. Sedangkan x[0].x[0], x[0].x[1], x[1].x[0], dan x[1].x[1] adalah masing-masing array satu dimensi yang beranggotakan 5 elemen. Dari sini diketahui bahwa x.length adalah 2, x[0].length dan x[1].length adalah 2. Sedangkan x[0].x[0].length, x[0].x[1].length, x[1].x[0].length, dan x[1].x[1].length adalah masing-masing 5.


7.8.1 Masalah: Temperatur Dan Kelembaban
Dimisalkan bahwa suatu stasiun meteorologi merekam temperatur dan kelembaban setiap jam setiap harinya dan menyimpan data sepuluh hari terakhir dalam suatu file teks yang diberi nama cuaca.txt. Setiap baris di dalam file tersebut memuat empat angka yang mengindikasikan hari, jam, temperatur, dan kelembaban. Contoh konten file ditampilkan pada (a):


Perhatikan bahwa setiap baris di dalam file belum tentu tampak rapi seperti pada (b). Tugas Anda adalah menulis suatu program untuk menghitung rerata temperatur dan kelembaban pada sepuluh hari terakhir. Anda bisa menggunakan redireksi masukan untuk membaca file dan menyimpan data dalam suatu array tiga dimensi, yang dinamakan data. Indeks pertama dari data memiliki rentang 0 sampai 9 yang merepresentasikan 10 hari, indeks kedua memiliki rentang 0 sampai 23 yang merepresentasikan 24 jam, indeks ketiga memiliki rentang 0 sampai 1 yang merepresentasikan, secara berturut-turut, temperatur dan kelembaban. Karena penomoran indeks array dimulai dari 0, maka data[0][0][0] menyimpan temperatur pada hari 1 jam 1, data[9][23][1] menyimpan kelembaban pada hari 10 jam 24, dan data[25][17][0] menyimpan temperatur pada hari 26 jam 18.

Program utuh diberikan pada kode7.5.

Kode7.5 Cuaca.java

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
31
32
33
34
35
36
import java.util.Scanner;

public class Cuaca {
  public static void main(String[] args) {
    final int JUMLAH_HARI = 10;
    final int JUMLAH_JAM = 24;
    double[][][] data
    = new double[JUMLAH_HARI][JUMLAH_JAM][2];

    Scanner masukan = new Scanner(System.in);
    // Membaca masukan menggunakan redireksi masukan dari suatu file
    for (int k = 0; k < JUMLAH_HARI * JUMLAH_JAM; k++) {
      int hari = masukan.nextInt();
      int jam = masukan.nextInt();
      double suhu = masukan.nextDouble();
      double kelembaban = masukan.nextDouble();
      data[hari - 1][jam - 1][0] = suhu;
      data[hari - 1][jam - 1][1] = kelembaban;
    }

    // Menemukan rerata temperatur dan kelembaban harian
    for (int i = 0; i < JUMLAH_HARI; i++) {
      double totalTemperaturHarian = 0, totalKelembabanHarian = 0;
      for (int j = 0; j < JUMLAH_JAM; j++) {
        totalTemperaturHarian += data[i][j][0];
        totalKelembabanHarian += data[i][j][1];
      }

      // Menampilkan hasil
      System.out.println("Hari " + i + " memiliki rerata temperatur = "
      + totalTemperaturHarian / JUMLAH_JAM);
      System.out.println("Hari " + i + " memiliki rerata kelembaban = "
      + totalKelembabanHarian / JUMLAH_HARI);
    }
  }
}

Keluaran

Hari 0  memiliki rerata temperatur = 77.7708
Hari 0 memiliki rerata kelembaban = 0.929583
Day 1 memiliki rerata temperatur = 77.3125
Day 1 memiliki rerata kelembaban =  0.929583
...
Day 9 memiliki rerata temperatur = 79.3542
Day 9 memiliki rerata kelembaban =  0.9125
Anda bisa menggunakan perintah ini untuk menjalankan program:

java Cuaca < cuaca.txt


7.8.2 Masalah: Menebak Ultah
Kode3.3, TebakUltah.java, memberikan suatu program untuk menebah hari ulang tahun seseorang. Program tersebut dapat disederhanakan dengan menyimpan angka-angka dalam suatu array tiga dimensi. Kode7.6 memberikan solusi seperti ini.

Kode7.6 TebakUltahMenggunakanArray.java

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.util.Scanner;

public class TebakUltahMenggunakanArray {
  public static void main(String[] args) {
    int hari = 0;
    int jawaban;

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

    // Menciptakan Scanner
    Scanner masukan = new Scanner(System.in);

    for (int i = 0; i < 5; i++) {
      System.out.println("Apakah Ultah Anda dlm Himpunan " + (i + 1) + "?");
      for (int j = 0; j < 4; j++) {
        for (int k = 0; k < 4; k++)
          System.out.printf("%4d", tanggal[i][j][k]);
        System.out.println();
      }
   
      System.out.print("\nMasukkan 0 untuk Tidak dan 1 untuk Ya: ");
      jawaban = masukan.nextInt();

      if (jawaban == 1)
        hari += tanggal[i][0][0];
    }

    System.out.println("Hari Ultah Anda adalah " + hari);
  }
}

Keluaran

Apakah Ulang Tahun Anda dalam Himpunan 1?
   1   3   5   7
   9  11  13  15
  17  19  21  23
  25  27  29  31

Masukkan 0 untuk Tidak dan 1 untuk Ya: 0
Apakah Ulang Tahun Anda dalam Himpunan 2?
   2   3   6   7
  10  11  14  15
  18  19  22  23
  26  27  30  31

Masukkan 0 untuk Tidak dan 1 untuk Ya: 1
Apakah Ulang Tahun Anda dalam Himpunan 3?
   4   5   6   7
  12  13  14  15
  20  21  22  23
  28  29  30  31

Masukkan 0 untuk Tidak dan 1 untuk Ya: 1
Apakah Ulang Tahun Anda dalam Himpunan 4?
   8   9  10  11
  12  13  14  15
  24  25  26  27
  28  29  30  31

Masukkan 0 untuk Tidak dan 1 untuk Ya: 0
Apakah Ulang Tahun Anda dalam Himpunan 5?
  16  17  18  19
  20  21  22  23
  24  25  26  27
  28  29  30  31

Masukkan 0 untuk Tidak dan 1 untuk Ya: 1
Hari Ultah Anda adalah 22

No comments:

Post a Comment