Download as pdf or txt
Download as pdf or txt
You are on page 1of 21

PELATIHAN ONLINE

ALCINDONESIA
ROAD,TO.KSN:2022
po.alcindonesia.co.id

PAKET 4
KOMPUTER SMA

Soal

ni. 0822 2430 1770 (Admin)


& www.alcindon esia.co.d () alc indonesia 0852 2327 3373 (Mas Aan)
Hi
PAKET 4 - MATERI DAN SOAL KOMPUTER

Catatan Tutor:
Materi dalam Pelatihan Online ini disusun bergantian antara Matematika dan Coding/
Pemrograman, karena memang materi uji KSNK meliputi keduanya, jadi materi pada minggu
ganjil (1,3,5,7…) adalah Matematika, sedangkan materi pada minggu genap (2,4,6,8,…) adalah
Coding/ Pemrograman

Modul 4: Percabangan

Materi dalam bagian ini memperkenalkan prinsip Percabangan serta penerapannya dalam C++.
Nama lain konsep ini adalah Pengambilan Keputusan atau Pemilihan Berkondisi.

1) Konsep Percabangan
Disebut konsep percabangan karena berdasarkan suatu kondisi/syarat, komputer bisa memilih
mengerjakan aksi A atau aksi B, jadi komputer bisa bercabang mengerjakan aksi yang berbeda.
Aksi A dikerjakan saat kondisi/ syarat terpenuhi (benar), sedangkan aksi B dikerjakan saat
kondisi/ syarat tidak terpenuhi (salah).
if (kondisi) {
// aksi A
} else {
// aksi B
}
Sering kali, suatu percabangan hanya memiliki aksi A saja, jadi aksi B nya tidak ada. Bentuk ini
dinyatakan sebagai konsep persyaratan (bukan percabangan, karena gak ada cabangnya, lha
cuma ada 1 aksinya).
if (kondisi) {
// aksi A
}

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


Walaupun tidak umum (dan juga tidak efisien saat eksekusi code) ada percabangan yang tidak
mengerjakan apa-apa saat aksi A, sedangkan aksi B-nya yang mengerjakan sesuatu. Dalam hal
ini bagian aksi A tetap harus ditulis walaupun kosong (sangat gak recommended bentuk ini, jika
possible, ubahlah ke bentuk persyaratan seperti di atas).
if (kondisi) { } else {
// aksi B
}

2) One Liner Action


Dalam kondisi apabila aksi A dan/ atau aksi B hanya berisikan 1 perintah/ statement saja, maka
tanda { } sebagai awal dan akhir blok, bisa dihilangkan, sehingga bentuk Code bisa menjadi
seperti ini: (lihat juga contoh lain pada bagian 4 di bawah)
if (kondisi) AksiA; else AksiB;
Contoh misalnya: if (nilai>75) Hasil="Lulus"; else Hasil="Gagal";

3) Decision Tree
Apabila dihadapi suatu percabangan dengan lebih dari 2 pilihan (misalnya 4 pilihan), maka
Programmer/ Coder akan dihadapkan dengan variasi bentuk Cabang Percabangan yang
berbeda-beda. Contoh misalnya di suatu sekolah berlaku aturan nilai A = 85 - 100, nilai B = 75 -
84, nilai C = 60 - 74 dan nilai D = 0 - 59, berarti dalam kondisi ini ada 4 pilihan aksi. Maka sebagai
contoh bisa dihasilkan Decision Tree seperti di bawah ini:

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


Tentu saja Decision Tree (DT) tidak perlu digambar saat membuat Code, cukup dipikirkan di
dalam otak. Tujuan penggambaran di atas adalah menunjukkan perbedaan pola pikir yang bisa
diambil oleh Coder berbeda untuk mencoba memecahkan konsep percabangan yang sama.
Sehingga dalam menilai suatu Code, tidak ada 1 jawaban (the only one answer) yang benar.
Semakin kompleks suatu problem, semakin banyak varian dan variasi logikanya. DT dan Code
hanya bisa dinilai efisiensinya, tampak dari 3 contoh DT di atas, DT pertama dan kedua tidak
balanced, DT pertama berat di kanan, sedangkan DT kedua berat di kiri. Yang balanced adalah
DT yang ketiga. Balanced DT akan sangat berguna pada kasus multiple percabangan memakai
operator ternary (lihat poin 6 di bawah).

4) Multiple Percabangan
Dari pembahasan DT di atas, itu adalah contoh dari multiple percabangan (banyak
percabangan), dan ketiga DT di atas berturut-turut bisa diwujudkan sebagai Code berikut:
if (nilai >= 85) cout << "grade A"; else
if (nilai >= 75) cout << "grade B"; else
if (nilai >= 60) cout << "grade C"; else cout << "grade D";
Sedangkan untuk DT kedua:
if (nilai < 85)
if (nilai < 75)
if (nilai < 60) cout << "grade D"; else cout << "grade C";
else cout << "grade B";
else cout << "grade A";
Dan untuk DT ketiga:
if (nilai < 75)
if (nilai < 60) cout << "grade D"; else cout << "grade C";
else if (nilai < 85) cout << "grade B"; else cout << "grade A";
Dari ketiga contoh implementasi tersebut, tampak bahwa perbedaan pola pikir (pola DT) akan
menyebabkan variasi juga dalam implementasi program/ coding.

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


5) Statement Pemilihan Khusus (Switch)
Statement switch hanya bisa dipakai untuk memeriksa variabel bertipe integer (bilangan bulat)
atau char (karakter) saja, dengan pemilihan kondisi yang khusus dan tertentu (exact). Jadi switch
tidak bisa dipakai untuk kondisi seperti di poin 4 di atas, karena nilai >= 85 itu tidak exact (bisa 85,
86, 87, …). Contoh pemakaian switch adalah untuk pemilihan kondisi nama pangkat Jendral
dalam TNI-AD:
switch (bintang) {
case 1: cout << "Brigadir Jendral"; break;
case 2: cout << "Mayor Jendral"; break;
case 3: cout << "Letnan Jendral"; break;
case 4: cout << "Jendral"; break;
default: cout << "Salah Input";
}
Dari contoh di atas, terlihat bahwa untuk setiap Aksi dari kondisi kasus (case) tidak memerlukan
kurung kurawal sebagai penanda blok, tetapi untuk setiap Aksi perlu diakhiri dengan statement
break, sedangkan kasus else (lainnya) memakai statement default dan tanpa memakai break.
Statement default tidak harus tersedia/ada, jadi jika tidak ada default, artinya komputer hanya
akan memproses berdasarkan isi masing-masing case yang exact, dan selain itu tidak ada aksi
apa pun.
Beberapa kondisi case dari switch dapat digabungkan menjadi 1, perhatikan contoh berikut:
switch (angka % 4) {
case 0:
case 2: cout << "sisa genap"; break;
case 1: cout << "sisa 1 ";
case 3: cout << "sisa ganjil"; break;
}
Dalam contoh tersebut sebuah angka di-modulus 4 (berarti sisanya kemungkinan antara 0, 1, 2,
atau 3). Saat kondisi sisa 0 atau 2, case nya digabungkan menjadi 1 Aksi, menghasilkan kata “sisa
genap”. Tetapi untuk kondisi case 1, yang akan dihasilkan adalah sekaligus kata “sisa 1 sisa
ganjil”, karena ketiadaan break di situ menyebabkan Aksi yang dijalankan terus berlanjut hingga
ditemukan break nantinya di case berikutnya. Sedangkan pada kondisi case 3, hanya akan
dicetak “sisa ganjil”. Jadi dari contoh tersebut nampak, bahwa break bukanlah kewajiban untuk
selalu dipasang di setiap case, dan dapat menyebabkan Aksi dari suatu case bisa merambat ke
case yang lain.

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


6) Operator Ternary ? dan :
C++ mengenal sebuah operasi ternary (operasi yang melibatkan 3 operand), yaitu gabungan ?
dan :, bentuknya adalah: (kondisi) ? (valueA) : (valueB), contoh pemakaiannya misalnya:
string Hasil = (nilai>75 ? "Lulus" : "Gagal");
cout << "Grade " << (nilai>=75 ? (nilai>=85?'A':'B') : (nilai>=60?'C':'D'));
Pada contoh baris pertama, nilai dibandingkan dengan 75, jika lebih besar berarti value “Lulus”
dimasukkan ke dalam variabel Hasil, sedangkan jika tidak lebih besar (lebih kecil sama dengan),
maka value “Gagal” yang akan dimasukkan ke dalam variabel Hasil. Contoh baris kedua adalah
penerapan DT ketiga pada poin 4 dengan memakai operator ternary. Perhatikan bahwa kondisi
A (benar) dan kondisi B (salah) dari operator ternary tidak boleh merupakan suatu statement
Aksi (contoh cout), tapi hanya bisa berupa value (suatu nilai) atau operasi (yang juga bisa berupa
operasi ternary lain atau operasi biasa misalnya tambah, kurang, kali, bagi, modulus). Nah,
nantinya value atau hasil operasi ini lah yang bisa dikirim ke statement lain (misalnya dicetak).

7) Gabungan Perbandingan/Kondisi
Untuk menggabungkan kondisi bisa dipakai operator-operator gabungan kondisi (bisa dibaca
ulang di Modul 3). Contoh kasusnya utk Multiple Percabangan di atas, juga bisa dikerjakan
dengan memakai 4 perintah If dengan Gabungan Kondisi, sekali pun kurang efisien:
if (nilai>=85 && nilai<=100) cout << "Grade A";
if (nilai>=75 && nilai<85) cout << "Grade B";
if (nilai>=60 && nilai<75) cout << "Grade C";
if (nilai>=0 && nilai<60) cout << "Grade D";
Jadi tampak memang, bahwa untuk permasalahan yang sama (contoh di atas mencetak Grade
nilai), bisa diselesaikan memakai Multiple Percabangan, Operator Ternary atau Gabungan
Kondisi.

Modul 5: Perulangan

Materi dalam bagian ini memperkenalkan prinsip Perulangan serta penerapannya dalam C++.

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


1) Konsep Perulangan
Disebut konsep perulangan (loop) karena memang mesin komputer akan mengulang sebuah
statement atau suatu blok statement beberapa kali sesuai dengan aturan yang telah diberikan.
Dipandang dari jenis perulangannya, ada 2 macam perulangan, yaitu: top-tested loop dan
bottom-tested loop. Sedangkan dipandang dari jumlah perulangannya, juga dibagi 2 yaitu:
counted loop dan uncounted loop.
Ada 3 perintah (statement) yang bisa dipakai untuk melakukan perulangan yaitu: for, while atau
do-while. For dan while tergolong top-tested, sedangkan do-while adalah bottom-tested.
Sedangkan yang tergolong counted loop, yang pasti adalah for, walaupun while dan do-while
juga bisa dibuat sebagai counted loop, dan yang tergolong uncounted loop adalah while dan
do-while, walaupun for juga bisa dibuat menjadi uncounted (not a recommended practice).
Top tested loop, artinya adalah pengecekan aturan syarat loop dikerjakan terlebih dahulu, baru
isi loop, sehingga jika pengecekan gagal saat pertama kali diujikan, isi loop tidak akan pernah
dikerjakan (minimal isi loop dijalankan 0 kali). Sedangkan bottom tested loop, artinya isi loop
dikerjakan dulu, baru pengecekan aturan syarat loop dilakukan, sehingga minimal isi loop pasti
akan dijalankan 1 kali.
Counted loop artinya adalah jumlah perulangan sudah bisa dipastikan sebelum pengulangan
dijalankan (misal: 7x mengulang, 200x mengulang, atau 0x mengulang). Sedangkan uncounted
loop artinya adalah jumlah perulangan tidak dapat dipastikan sebelum perulangan dijalankan
atau pun pada saat perulangan sedang dijalankan.

2) Perulangan while()
Bentuk perulangan while() adalah seperti ini:
while (syarat) {
// isi perulangan (statement yg akan diulangi)
}
Jadi kelihatan karena syarat dipasang di atas, jika syarat tidak terpenuhi, otomatis isi loop tidak
akan dikerjakan oleh komputer (top tested loop).
While() dapat dipakai untuk counted loop atau pun uncounted loop. Contoh berikut adalah
penerapan while() untuk counted loop:
int a=5;
while (a<=20) cout << a++ << endl;

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


Dari contoh di atas, karena isi while() hanya 1 perintah (one liner), maka penanda awal dan akhir
blok { } bisa dihilangkan. While() dalam contoh tersebut disebut counted, karena bisa dipastikan
bahwa loop akan berulang mencetak 5, 6, 7, …, 20. Sedangkan berikut adalah contoh penerapan
while() untuk kondisi uncounted:
int a=0;
while (a<=20) {
cin >> a;
cout << a << endl;
}
Pada contoh di atas, karena nilai a di-input, maka bisa saja hanya 1x loop selesai (misalnya a
langsung diisi 50), atau bisa saja tidak akan pernah selesai/ unending, karena a selalu di-input
nilai angka yang <= 20. Dalam hal ini komputer tidak akan pernah bisa tahu, berapa kali loop
perlu dikerjakan, sebelum selesai.

3) Perulangan do-while()
Bentuk perulangan do-while() adalah seperti ini:
do {
// isi perulangan
} while (syarat);
Jadi dalam bentuk ini, mesin komputer akan mengerjakan (do) isi perulangan, baru syarat akan
diperiksa untuk menentukan apakah perulangan akan dilakukan kembali ataukah diakhiri.
Contoh do-while() untuk bentuk counted adalah:
int a = 10;
do cout << ++a << endl; while (a<=20);
Potongan code di atas merupakan bentuk one-liner, dan akan menghasilkan pola teratur yaitu
11, 12, 13, …, 21 (perhatikan letak ++ yg merupakan prefix, jadi akan dikerjakan duluan, baru
diikuti cetak). Sedangkan contoh untuk bentuk uncounted adalah:
int a;
do {
cin >> a;
cout << a << endl;
} while (a<=50);
Kelihatan dari code di atas, memang jika input a selalu <= 50, maka loop tersebut tidak akan
pernah berhenti, sehingga komputer tidak akan pernah tahu, berapa kali loop akan dijalankan.

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


4) Perulangan for()
Bentuk perulangan for() adalah seperti berikut:
for (kondisi_awal; kondisi_akhir; naik/turun) {
// isi loop
}
Contoh misalnya untuk mencetak loop counted kelipatan 3 mulai dari 20 sampai 40:
for (int a=20; a<=40; a+=3) cout << a << endl;
Code di atas juga merupakan one-liner, sehingga awal dan akhir blok bisa tidak dipakai. Hasilnya
akan mencetak 20, 23, 26, 29, … 38. Sedangkan contoh untuk bentuk tanpa kondisi akhir dari
for(), (walaupun tidak recommended untuk dipakai, karena memerlukan bantuan perintah break
untuk menghentikannya):
for (int a=1;;) {
cout << a++ << endl;
if (a==20) break;
}
Contoh di atas akan menghasilkan pola counted 1, 2, 3, … , 19, dan kemudian karena ada break
pada saat a adalah 20 (karena postfix, maka sesudah mencetak 19, maka a akan menjadi 20),
maka for() akan terhenti, lebih jauh tentang perintah break akan dibahas di poin 5 di bawah.
Bandingkan hasilnya dengan contoh berikut:
for (int a=1;;++a) {
cout << a << endl;
if (a==20) break;
}
Pada contoh di atas akan mencetak pola counted 1,2,3,…,20, mengapa? Karena kondisi
naik/turun sebagai parameter ketiga dari for(), akan dijalankan paling terakhir, sehingga selesai
mencetak 19, dilakukan pengecekan if() dulu, baru mengerjakan ++a. Sedangkan pada contoh di
bawah ini, adalah bentuk uncounted-nya dari for():
int a=20;
for (;a<=50;) {
cin >> a;
cout << a << endl;
}
Jelas dari logika code di atas, karena a di-input, sehingga selama a selalu <= 50, maka for()
tersebut tidak akan pernah berakhir, sehingga tidak dapat dipastikan berapa kali perulangan
for() akan dikerjakan (dan menjadi bentuk uncounted).

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


5) Statement break
Statement (perintah) break dipakai untuk menghentikan jalannya eksekusi blok isi loop (for,
while, do-while) pada lokasi break. Perhatikan contoh for() 3 lapis (nested) di bawah ini:
for (int a=1; a<10; a++) {
cout << a;
for (int b=1; b<10; b++) {
if (b==4) break;
for (int c=1; c<10; c++) {
cout << c;
if (c==6) break;
}
cout << b;
}
cout << endl;
}
Coba ketik code di atas pada C++ Editor (lengkapi dengan #include, using namespace std dan int
main()-nya). Dari pola hasil yang dicetak, tampak bahwa a akan dikerjakan lengkap 1 s/d 9, b
hanya akan dicetak sampai 3 saja, sedangkan c hanya akan selalu berisikan 1 s/d 6. Perhatikan
juga code di bawah untuk contoh kombinasi pemakaian while() dan break:
int a = 4;
while (a<=50) {
cin >> a;
if (a==24) break;
cout << a << endl;
}
Dari contoh di atas, memang selama input a <= 50, while akan terus dijalankan, kecuali ada 1
kondisi khusus yaitu jika input a adalah 24, maka while diperintahkan untuk segera diakhiri
karena adanya statement break. Code tersebut dapat diubah juga menjadi seperti ini untuk
menghindari break:
int a = 4;
while (a<=50 && a!=24) {
cin >> a;
if (a!=24) cout << a << endl;
}
Walaupun dari segi efisiensi, lebih efisien versi code dengan break, tapi penggunaan break,
apalagi pada code yg rumit dan panjang, terkadang dapat menimbulkan kebingungan, kenapa
pada saat tertentu (yg tak terduga), koq code saya bisa tiba-tiba berhenti sendiri. Jadi
pergunakan break dengan bijaksana.
0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


6) Statement continue
Statement continue digunakan untuk membatalkan baris-baris statement di bawah continue
dan langsung menjalankan parameter ketiga yaitu naik/turun dari for(), atau dalam kasus while()
atau do-while() akan langsung mengerjakan loop selanjutnya. Perhatikan code berikut:
for (int a=1; a<10; a++) {
cout << a;
if (a==4) continue;
cout << a << endl;
}
Hasil dari code di atas, saat dijalankan akan mencetak dobel nilai a 11, 22, 33, 455, 66, … 99
karena saat a bernilai 4, akan dikerjakan perintah cout pertama, lalu kena continue, sehingga
akan langsung ke parameter ketiga for a++ (perintah cout << a << endl tidak akan dikerjakan).
Perhatikan contoh code berikut untuk gabungan while dan continue:
int a=1;
while (a<=50) {
cout << ++a;
if (a==18) break;
if (a>10) continue;
cout << a++ << endl;
}
Hasil code di atas adalah pola 22, 44, 66, 88, 1010, kemudian dilanjutkan 12131415161718 baru
terhenti. Mengapa? Karena saat a > 10, ditemukan continue, otomatis perintah cetak a++ dan
enter akan diabaikan, while akan langsung mengerjakan loop selanjutnya, dan sesudah a
menjadi 18, maka akan terhenti karena break.

7) Tiga Macam Bentuk Uji dalam Kontes Pemrograman


Dalam Lomba/ Kontes Pemrograman, ada 3 macam bentuk kasus uji yang berkaitan dengan
loop (perulangan), yaitu:
A) Jumlah data/kasus uji sudah diberitahukan terlebih dahulu, contoh soalnya: diberikan input N
yang menyatakan jumlah mobil, lalu N data berikutnya adalah nomor stiker di pintu mobil,
seperti ini:
4
24 75 11 34
Untuk bentuk seperti ini, dapat dipakai model code berikut:

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


cin >> N;
for (int a=0; a<N; a++) cin >> data[a];
Tampak dari code di atas, karena udah pasti (counted), maka paling mudah dipakai perintah
looping for, walaupun memakai while juga bisa saja, seperti berikut:
cin >> N;
while (N--) {
cin >> data[N];
}
B) Ada data/kasus uji khusus yang menandakan akhir dari input, kasus uji khusus ini tidak boleh
diproses, contoh soalnya: diberikan pasangan data nilai tertinggi dan nilai terendah, input akan
diakhiri dengan pasangan data -1 -1, dan data ini tidak perlu diproses, data sesudah input ini
harus diabaikan, seperti ini:
65 34
12 75
-1 -1
33 70
Untuk bentuk soal seperti ini, dapat dipakai code sebagai berikut:
while (true) {
cin >> a >> b;
if (a==-1 && b==-1) break;
// processing goes here
}
Sedangkan versi tanpa break, bisa memakai model code berikut:
bool selesai=false;
while (!selesai) {
cin >> a >> b;
if (a==-1 && b==-1) selesai=true; else {
// processing goes here
}
}
C) Semua input adalah data yang harus diproses, program berhenti saat input habis, contoh
soalnya seperti ini: diberikan 3 nilai A, B, C lalu proseslah dengan memakai ketentuan …, contoh
inputnya:
64 33 25
35 20 55
Untuk menangani model input tersebut, dapat dipakai model code ini:
while (cin >> A >> B >> C) {
// processing goes here
}

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


Jadi perintah cin dapat dipakai sebagai syarat while() karena apabila cin gagal (karena udah gak
ada input), otomatis itu menjadi syarat untuk menghentikan looping while juga. Nama lain
bentuk seperti ini adalah EOF (end of file), jadi artinya proseslah semua input sampai “end of file”
atau sampai habis file-nya. Untuk mensimulasikan kondisi EOF ini pada Console/ Command
Prompt C++ dipakai kode khusus yaitu Ctrl+Z atau bisa disimulasikan dengan memakai text file
(file hasil Notepad) yang dimasukkan sebagai data dari code kita.

8) Prinsip Akumulator (Linear Scan)


Dalam mengolah suatu data, terdapat prinsip akumulator atau dikenal juga dengan prinsip
linear scan. Artinya data akan diperiksa satu-per-satu, sehingga pengetahuan/ informasi yang
dimiliki oleh komputer akan terakumulasi, tentu saja penerapannya akan memakai looping.
Contoh kasus misalnya:
* menjumlahkan semua data, maka data perlu satu-per-satu diakumulasi jumlahnya ke suatu
variabel penampung (akumulator), jangan lupa harga awal penampung haruslah 0
* mencari data terbesar (atau terkecil), maka data perlu dicek satu-per-satu dengan
dibandingkan dengan suatu variabel penguji, harga awal variabel penguji ini, jika ingin mencari
data terbesar adalah seminimal mungkin (kebalikannya jika ingin mencari data terkecil, maka
harga awal dibuat semaksimal mungkin)
* mencari berapa data yang lebih besar dari suatu nilai tertentu (rata-rata misalnya), maka
diperlukan 2x proses akumulasi, pertama dibutuhkan akumulasi penjumlahan, untuk kemudian
dibagi dengan banyaknya data, lalu dilakukan proses akumulasi kedua, yaitu memeriksa
satu-per-satu apakah data input lebih besar dari nilai rata-ratanya

9) Prinsip Interval Antar Data (Differences)


Dalam kasus tertentu, pengolahan data melibatkan nilai interval (nilai proses dari 2 data/ atau
lebih). Sehingga proses loop biasanya akan dimulai bukan dari data pertama (misalnya yang
akan diolah 3 data, maka proses loop akan start dari data ke-3). Dan nantinya di dalam proses,
akan terjadi pergeseran makna data. Contoh:
* menentukan interval beda antar data yang terbesar, jadi ingin dicari selisih/ beda paling
maksimal antar 2 data yang bersebelahan, maka prosesnya data pertama menjadi nilai sebelum,
kemudian dalam looping, akan dibaca nilai sekarang, lalu dicari selisihnya, untuk dibandingkan
dengan akumulasi nilai terbesar, kemudian selesai proses, makna data digeser, sehingga data
nilai sekarang akan menjadi nilai sebelum, perhatikan contoh implementasi code-nya:

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


int sebelum, sekarang, maxbeda=0, beda;
cin >> sebelum;
for (int i=2; i<=N; i++) {
cin >> sekarang;
beda = abs(sekarang-sebelum);
if (beda>maxbeda) maxbeda = beda;
sebelum = sekarang;
}
Jadi dalam contoh tersebut di atas, terdapat juga proses akumulasi, tetapi fokuskan pada proses
intervalnya untuk memahami prinsip pada bagian ini.

Modul 6: Competitive Programming

Materi dalam bagian ini akan memperkenalkan mengenai dunia Competitive Programming
beserta konsep Online Judge yang sering dipakai dalam lomba/ kontes pemrograman.

1) Competitive Programming
Competitive Programming adalah salah satu cabang dari Programming (pemrograman/ coding)
yang fokusnya adalah:
* menghasilkan code yang efisien
* memakai algoritma/ metode yang tepat untuk memecahkan suatu problem
* dalam tempo pengerjaan yang terbatas
* dengan waktu eksekusi yang terbatas
* yang diselenggarakan sebagai suatu kontes/ lomba.
Berikut adalah Kontes/ Lomba CP yang terkenal:
* Kompetisi ITB, UI, UGM, ITS, Universitas Telkom, Universitas Bina Nusantara
* KSN (Kompetisi Sains Nasional)
* APIO (Asia Pasific Informatics Olympiad)
* IOI (International Olympiad in Informatics)
* ICPC (International Collegiate Programming Contest)
* Kompetisis Google, Microsoft, FaceBook, TopCoder

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


2) Persiapan dan Pelatihan
Untuk mempersiapkan diri dalam menghadapi kontes-kontes tersebut di atas, ada beberapa
langkah persiapan dasar:
A) Mempelajari topik-topik yang terkait Matematika Diskret (Logika, Himpunan, Kombinatorika,
Teori Bilangan, Teori Graph).
B) Mempelajari bahasa pemrograman C++.
C) Bergabung ke website pelatihan resmi dari Tim Olimpiade Komputer Indonesia, yaitu TLX
(TOKI Learning Center), tlx.toki.id. Saat ini ditawarkan 2 Modul Pelatihan di TLX yaitu
Pemrograman Dasar dan Pemrograman Kompetitif Dasar.
D) Mempelajari Algoritma Matematika/ Komputasi terkait problem-problem yang sering
disajikan dalam kontes/ lomba pemrograman.
E) Bergabung ke berbagai macam Online Judge di Internet (seperti CodeForces, CodeChef,
Online Judge, Exercism, CSES, SPOJ, HackerRank, TopCoder, Kattis, dll.)

3) Mengenal Online Judge


Online Judge adalah suatu server yang tersedia di Internet, yang memungkinkan peserta untuk
mengerjakan suatu soal coding/ programming, dan akan dinilai oleh server tersebut secara
otomatis. Prinsip dasarnya, server Online Judge akan menilai output (hasil) program peserta
untuk dibandingkan dengan output (hasil) program juri. Apabila hasilnya sama persis, maka
program peserta akan diberikan nilai AC (Accepted), tetapi jika ada 1 saja ketidakcocokan, maka
program peserta akan diberikan nilai WA (Wrong Answer).
Selain AC dan WA, hasil penjurian dari Online Judge juga ada beberapa kondisi lain, yaitu:
CE = compile error, terjadi karena program peserta tidak bisa di-compile di komputer server,
biasanya karena ada yang gak sengaja terhapus 1 atau 2 karakter, atau ada perbedaan versi
compiler antara komputer pribadi peserta dengan komputer server Online Judge.
RE = runtime error, terjadi karena ada 1 atau 2 kasus khusus yang menyebabkan program
peserta mengalami kesalahan saat dijalankan, biasanya hasil ini muncul karena ada input yang
tricky, sehingga menyebabkan kesalahan seperti pembagian dengan 0, array yang keluar batas,
pembulatan yang salah/tidak disengaja, atau operasi-operasi lain yang tidak diizinkan oleh
komputer.

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


TLE = time limit exceeded, terjadi karena program peserta melebihi batas waktu running time
yang diizinkan, penyebabnya biasanya karena looping/ rekursif yang tidak pernah berakhir,
looping/ rekursif yang terlalu banyak (tidak efektif), atau bisa juga karena kesalahan proses
input sehingga menyebabkan komputer menjadi stall (menunggu input yang keliru/ tidak
pernah ada).
MLE = memory limit exceeded, terjadi karena program peserta melebihi batas pemakaian
memory yang diizinkan, penyebabnya biasanya struktur array/ matrix yang terlalu besar, atau
tabel DP yang kurang optimal (sehingga menjadi terlalu besar juga).

4) Macam-Macam Online Judge di Internet


Ada banyak sistem Online Judge di Internet, tetapi di bawah ini akan dibahas beberapa yang
dianggap paling bermanfaat bagi peserta:
A) TLX (TOKI Learning Center), tlx.toki.id. TLX merupakan website resmi pelatihan Tim Olimpiade
Komputer Indonesia, dan salah satu Online Judge yang memakai B.Indonesia, sangat
disarankan bagi peserta untuk bergabung di TLX, dan mengerjakan soal-soal latihan yang ada di
dalamnya.
B) Code Chef, codechef.com. Sebuah website pelatihan yang berbasis di Mumbai, India. Website
ini banyak dipakai dan bekerjasama dengan sekolah-sekolah dan kampus-kampus di India (dan
juga di luar India). Disarankan untuk peserta yang bergabung ke sini, bisa mengerjakan
Beginner Practice Problem, ada sekitar 330+ soal di sini diurutkan berdasarkan jumlah peserta
yang sudah mencoba/ Submission (biasanya semakin banyak yang sudah mencoba,
menandakan soal tersebut cukup mudah). Tapi peserta bisa mengubah pengurutan
berdasarkan Accuracy untuk mencari soal-soal yang agak mudah. Selain itu CodeChef juga
menawarkan materi Tutorial untuk topik-topik Algoritma/ programming.
C) Code Forces, codeforces.com, adalah website dari Russia, yang sangat rajin sekali
mengadakan kontes online (rata-rata antara 2 sampai 3 kontes dalam seminggu). Sayangnya
kebanyakan kontes di sini adalah Divisi 1 dan Divisi 2, sedangkan untuk pemula disarankan
untuk ikut dulu kontes Divisi 3 (biasanya dalam sebulan cuma ada 2x kontes Divisi 3). Tapi bagi
peserta yang ingin merasakan bagaimana situasi kontes yang sebenarnya, sangat disarankan
untuk bergabung ke website ini. Selain contest, peserta dapat mencari problem/ soal dengan
diurutkan berdasarkan rating dan jenis algoritma, dan peserta bisa mengakses artikel blog/
materi pembahasan Algoritma.

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


D) Online Judge (dulu namanya UVa Online Judge), onlinejudge.org, salah satu website pelatihan
tertua, berdiri sejak Juli 2000. Ada 5000+ Problem tersedia di website ini, yang sayangnya
diurutkan berdasarkan tanggal problem tersebut ditambahkan ke dalam sistem. Maka agar
memudahkan kita belajar, ada pasangan dari website ini yaitu UVA Hunt/ UHunt
(uhunt.onlinejudge.org), yang berusaha untuk mengelompokkan problem-problem tersebut
dalam Chapter dan Sub-Chapter, diharapkan peserta sudah bisa mulai mengerjakan Chapter 1
Sub-Chapter Getting Started (total ada 69 Problem) dari website UHunt.
E) CSES (Code Submission Evaluation System), cses.fi, adalah website dari Finlandia, yang salah
satu pendirinya adalah Antti Laaksonen, Ketua Tim Pembinaan Olimpiade Komputer Finlandia
2009 - 2016. Selain menyediakan Problem untuk latihan, di website tersebut juga tersedia buku
Competitive Programmer’s Handbook karya beliau yang bisa di-download secara gratis.

5) Buku/Materi Pendukung
Ada beberapa e-book gratis dan resmi yang dapat mendukung proses belajar dan persiapan CP
anda, yaitu:
1. E-book Pemrograman Kompetitif Dasar karya William Gozali dan Alham Fikri Aji, keduanya
adalah alumni Tim Olimpiade Komputer Indonesia, e-book ini bisa di-download dari
https://osn.toki.id/arsip/pemrograman-kompetitif-dasar.pdf
2. E-book Art of Programming Contest karya Ahmed Shamsul Arefin dari Bangladesh, salah satu
kontestan ICPC dari Dhaka, Bangladesh, e-book ini bisa di-download dari
https://e-booksdirectory.com/details.php?ebook=1051
3. E-book Competitive Programmer’s Handbook karya Antti Laaksonen dari Finlandia, yang
sudah disebutkan di poin 2, alamat download-nya https://cses.fi/book/index.php
Selain materi khusus CP, ada juga beberapa e-book Algoritma gratis dan resmi yaitu:
1. E-book Algorithms Notes for Professional, dari GoalKicker.com, bisa di-download dari alamat
https://books.goalkicker.com/AlgorithmsBook/
2. E-book Elementary Algorithms karya Larry Liu Xin Yu, bisa di-download dari
https://github.com/liuxinyu95/AlgoXY/releases/download/v0.618033/elementary-algorithms.pdf
Sedangkan untuk buku berbayar, yang direkomendasikan adalah:
1. Buku Competitive Programming (Edisi 4) karya Steven Halim, Felix Halim dan Suhendry
Effendy, beliau bertiga merupakan warga negara Indonesia yang banyak memberikan
sumbangsih bagi kemajuan dunia Competitive Programming baik secara nasional maupun
internasional, buku mereka dapat dibeli lewat website resmi https://cpbook.net/

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


2. Buku Introduction to Algorithms (Edisi 3) karya Thomas Cormen, Charles Leiserson, Ronald
Rivest dan Clifford Stein, buku utama yang membahas tentang algoritma secara menyeluruh
(warning, sangat tebal, 1272 halaman), bisa dibeli lewat toko buku Amazon atau toko buku
online luar negeri lainnya.
3. Buku The Algorithm Design Manual (Edisi 2) karya Steven Skiena, buku yang banyak
membahas mengenai optimalisasi algoritma sehingga cocok untuk diterapkan dalam dunia CP,
cukup tebal 730 halaman, bisa dibeli juga lewat toko buku Amazon atau toko buku online luar
negeri lain.

Latihan Soal

1. Diberikan potongan program berikut:


if (x*y == 0) cout << "on Axis";
else if (x*y > 0) cout << ((x>0)?"Q1":"Q3");
else cout << ((x>0)?"Q4":"Q2");
Apakah hasilnya jika diberikan input x=9 dan y=4?
a.Q1 b.Q2 c.Q3 d.Q4 e.on Axis
2. Perhatikan potongan code berikut:
switch (a ^ b) {
case 0: a += b; break;
case 1: a += b;
case 2: a += b; break;
default: a *= b;
}
Berapakah nilai akhir a jika awalnya a=5 dan b=4?
a. 4 b. 5 c. 9 d. 13 e. 20
3. Berapakah nilai c pada code: c=18 & ((5%2==0)?12:16) | (2<<3>12);
a.12 b.16 c.17 d.18 e.34
4. Perhatikan potongan code di bawah ini:
if (a%3==0) c+=(b>c)?(b+(c*3)/2):(c+(b*3)/2);
else b+=(b>c)?(b+(c*3)/2):(c+(b*3)/2);
cout << a << b << c;
Jika nilai awal a=7, b=8 dan c=2, maka apakah hasilnya?
a. 7192 b. 7196 c. 7222 d. 7813 e. 7816

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


5. Tahun Kabisat sesuai aturan Gregorian didefisinikan sebagai tahun abad yang habis dibagi
400 atau tahun bukan abad yang habis dibagi 4. Sedangkan tahun abad adalah tahun yang
habis dibagi 100. Pak Dengklek membuat implementasi code untuk mengecek tahun
Kabisat dengan cara sebagai berikut:
if ((t%100==0 || t%4==0) || t%400==0) Kabisat = true; else Kabisat = false;
Tentukan input mana, yang menyebabkan code Pak Dengklek keliru menentukan tahun
Kabisat?
a. 2000 b. 2020 c. 2021 d. 2022 e. 2100
6. Pola manakah yang dihasilkan oleh code berikut:
for (int a=1; a<=9; a+=2) {
for (int b=1; b<a; b+=2) cout << " ";
for (int c=1; c<=a; c+=9) cout << "*";
cout << endl;
}
a. * b. * c. * d. * e. *
** * * ** **
*** * * * * *
**** * * ** * *
***** * * * * *
7. Perhatikan potongan code berikut:
while (a>b) { a-=b; c++; d+=b; }
cout << c << " " << d;
Jika diinginkan hasil akhir "9 90", maka berapakah nilai awal a, b, c, d?
a. 90 9 0 0 b. 90 10 0 0 c. 99 9 0 0 d. 99 11 0 0 e. semua pilihan salah
8. Apakah hasil dari code berikut, jika n=7?
for (a=0; a<n; a++) for (b=1; b<n; b++) if (b<a) cout << b;
a. 123456 b. 122333444455555
c. 123123123123 d. 123123123412345
e. 112123123412345
9. Pada soal Chapter 3E berjudul Luas Segitiga di TLX
(https://tlx.toki.id/courses/basic/chapters/03/problems/E), untuk pengaturan output agar
sesuai dengan permintaan soal, dipakai setting …
a. fixed dan setprecision(2) b. scientific dan setprecision(2)
c. fixed dan setdecimal(2) d. scientific dan setdecimal(2)
e. tidak ada pilihan jawaban yang benar

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


10. Untuk soal Chapter 5F berjudul Floor dan Ceiling di TLX
(https://tlx.toki.id/courses/basic/chapters/05/problems/F), apakah pengecekan floor dan
ceiling sama logikanya pada kasus bilangan positif dengan pada kasus bilangan negatif?
a. ya, logika if-nya sama b. ya, perintah cout-nya sama
c. tidak, logika if-nya berbeda d. tidak, perintah cin-nya berbeda
e. tidak dapat ditentukan karena ini memakai loop while()
11. Soal berkode 4A berjudul Watermelon dari Code Forces
(https://codeforces.com/problemset/problem/4/A), dapat dipecahkan dengan memakai
operasi?
a. + b. - c. * d. / e. %
12. Menyambung soal 4A dari Code Forces di atas, terdapat sebuah uji kasus jebakan yaitu nilai
input …
a. 1 b. 2 c. 3 d. 4 e. 5
13. Soal berkode 11614 berjudul Etruscan Warriors Never Play Chess dari Online Judge
(https://onlinejudge.org/external/116/11614.pdf) menerapkan model input kasus uji yang
mana? (baca penjelasan di Modul 5 bagian 7)
a. model A b. model B c. model C d. semua benar e. tidak ada pilihan benar
14. Menyambung soal 11614 dari Online Judge di atas, bacalah batasan yang diberikan oleh soal,
kemudian tentukan, tipe data manakah yang paling sesuai untuk membaca input datanya?
a. int b. double c. char d. long long e. string
15. Pada soal Enormous Input Test (kode INTEST) di Code Chef
(https://www.codechef.com/problems/INTEST), cin dan cout milik C++ memang lebih lambat
dalam memproses input dan output dibanding scanf dan printf dari C, sehingga berpotensi
menjadi TLE, tetapi ada 2 cara yang bisa dipakai untuk mempercepat cin cout di C++, yaitu …
(hint: codeforces.com/blog bisa menjadi sumber awal riset untuk mengatasi masalah ini)
a. cin.gets(NULL); dan ios::synchronization(true);
b. ios::sync_with_stdio(false); dan cin.tie(NULL);
c. ios::getline(NULL); dan ios::sync(NULL);
d. ios::synchronize(false); dan cin.sync(false);
e. cin.sync(true); dan cin.mode(fast);

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )


16. Pada soal First and Last Digit (kode FLOW004) di Code Chef
(https://www.codechef.com/problems/FLOW004), manakah potongan code yang benar
untuk mencari digit pertama/ digit yang paling depan?
a. while (n > 10) n /= 10; b. while (n > 10) n %= 10;
c. while (n > 9) n /= 10; d. while (n > 9) n %= 10;
e. while (n >= 10) n %= 10;
17. Bacalah model input dari soal berkode 10055 berjudul Hashmat the Brave Warrior dari
Online Judge (https://onlinejudge.org/external/100/10055.pdf), tentukan model input yang
sesuai untuk soal tersebut:
a. model A b. model B c. model C d. semua benar e. tidak ada pilihan benar
18. Pada soal berkode 281A berjudul Word Capitalization dari Code Forces
(https://codeforces.com/problemset/problem/281/A), kondisi syarat if manakah yang valid
untuk memeriksa dan mengolah kapitalisasi huruf pertama di soal tersebut?
a. if (S[0]>='A' || S[0]<='Z') S[0] -= 32; b. if (S[0]>='a' || S[0]<='z') S[0] -= 32;
c. if (S[0]>='A' && S[0]<='Z') S[0] -= 32; d. if (S[0]>='a' && S[0]<='z') S[0] -= 32;
e. tidak ada pilihan yang benar
19. Pada soal berkode 266A berjudul Stones on the Table dari Code Forces
(https://codeforces.com/problemset/problem/266/A), untuk melakukan pengecekan warna
batu yang bersebelahan dipakai prinsip …, sedangkan untuk mendata jumlah batu yang
disingkirkan dipakai prinsip …
a. akumulator dan akumulator b. akumulator dan interval
c. interval dan akumulator d. interval dan interval
e. tidak ada pilihan yang benar
20. Proses utama untuk soal berkode 791A berjudul Bear and Big Brother dari Code Forces
(https://codeforces.com/problemset/problem/791/A) adalah memakai …
a. looping for b. looping while
c. looping do-while d. operator ternary ? :
e. tidak perlu looping, cukup statement if saja

0822 2430 1770 ( admin )

www.alcindonesia.co.id instagram : alc_indonesia 0852 2327 3373 ( mas aan )

You might also like