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