Anda di halaman 1dari 3

CSGE602040 - Struktur Data dan Algoritma

Semester Genap - 2020/2021


Pembahasan Lab 1

Pembahasan Menerjemahkan Pesan Rahasia

Deksripsi Singkat
Diberikan string S hanya memuat karakter (, ), {, }, [, dan ]. Cek apakah string tersebut valid atau
tidak berdasarkan deskripsi soal. Jika string tersebut valid, keluarkan juga pasangan untuk semua
karakter.

Ide
Pada dasarnya, soal ini adalah mengecek apakah suatu string memenuhi karakteristik balanced
parantheses atau tidak. Ide dasar dari soal ini adalah mengecek untuk tiap bracket yang terbuka yaitu
(, {, dan [ apakah terdapat pasangan bracket tertutupnya atau tidak. Pasangan bracket tertutupnya
juga harus sesuai yaitu jika bracket terbukanya adalah “(“, maka bracket tertutupnya adalah “)”, dan
begitu juga untuk tipe bracket yang lain.

Oleh karena itu, kita dapat menggunakan ADT stack untuk menyimpan kemunculan tiap bracket
terbuka. Kita menggunakan stack karena tiap kita menemukan karakter bracket tertutup, yang harus
kita coba pasangkan adalah karakter bracket terbuka terakhir yang belum dicek.

Jadi, ide keseluruhannya adalah kita lakukan iterasi dari awal string. Kemudian, tiap menemukan
karakter bracket terbuka, kita catat indeksnya dalam stack. Ketika menemukan karakter bracket
tertutup, kita lakukan operasi pop dari stack untuk mendapatkan sekaligus mengeluarkan indeks
yang ada di top of stack. Kemudian kita cek apakah bracket tertutup yang kita temui sesuai dengan
karakter di indeks yang baru saja di-pop. Jika ya, kita catat pasangannya dan jika tidak, maka invalid.
Untuk mencatat pasangan kita bisa gunakan list atau arraylist. Kasus khusus jika ternyata stack-nya
kosong, maka akan langsung invalid karena kita mengetahui bahwa bracket tertutup tersebut tidak
memiliki pasangan.

Berikut ini adalah potongan program ide tersebut.

Pembahasan Lab 1 SDA Genap 2020/2021


S = in.next()
n = S.length()
Stack<Integer> st = new Stack<Integer>();
int[] pairs = new int[n];
boolean isValid = true;

for (int i = 0; i < n && isValid; ++i) {


if (S.charAt(i) == '(' || S.charAt(i) == '{' || S.charAt(i) == '[') {
st.push(i); // bracket terbuka, push indeks ke stack
}
else { // bracket tertutup, cek pasangan yang ada di top of stack
if (st.empty()) {
isValid = false;
// kasus khusus ketika stack kosong, langsung invalid
}
else {
int topIndex = st.pop();
if (S.charAt(i) == ')' && S.charAt(lastIndex) != '(') isValid
= false;
else if (S.charAt(i) == '}' && S.charAt(lastIndex) != '{')
isValid = false;
else if (S.charAt(i) == ']' && S.charAt(lastIndex) != '[')
isValid = false;
else pairs[lastIndex] = i;
}
}
}

Setelah kita selesai melakukan iterasi semua indeks, kita perlu mengecek lagi apakah stack sudah
kosong atau belum. Hal ini perlu dilakukan karena jika stack tidak kosong artinya ada bracket terbuka
yang tidak mendapat pasangan. Contoh kasusnya adalah bila input string S = “[[]]{{“”. Jadi, kita
tambahkan potongan kode berikut.

if (!st.empty()) {
isValid = false;
}

Catatan: Ketika menjelang deadline, tim asdos baru menyadari bahwa kasus diatas tidak ada dalam
test case sehingga jika di solusi kalian tidak terdapat potongan kode tersebut, akan tetap Accepted.
Namun, kedepannya jika kalian menemukan soal seperti ini lagi, jangan lupa menambahkan
potongan kode diatas.

Langkah terakhir adalah mengeluarkan solusi pasangan. Kita dapat memanfaatkan list atau arraylist
yang telah kita buat sehingga tidak perlu lagi melakukan sorting. Berikut contoh cara mengeluarkan
solusinya.

Pembahasan Lab 1 SDA Genap 2020/2021


if (isValid) {
out.println("VALID");
out.println(n/2);
for (int i = 0; i < n; ++i) {
if (pairs[i] > i) { // untuk menghindari mencetak solusi dua kali
out.print(i+1); out.print(" "); out.println(pairs[i]+1);
}
}
}
else {
out.println("INVALID");
}

Terdapat loop dengan N iterasi, dan tiap iterasinya berjalan O(1) karena operasi push dan pop pada
stack memiliki kompleksitas O(1). Oleh karena itu, kompleksitas akhir dari solusi ini adalah O(N).
Cukup untuk menyelesaikan test case dengan panjang string <= 1.000.000.

Pembahasan Lab 1 SDA Genap 2020/2021

Anda mungkin juga menyukai