KOMPUTER – PAKET 8
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 8
DASAR PEMROGRAMAN 2
Berhubung semua materi dari dasar pemrograman sudah Saya berikan di paket
sebelumnya, pada paket ini Saya hanya akan memberikan tips-tips mengerjakan soal-soal
Algoritmika.
Terdapat beberapa tips untuk memahami maksud dari suatu algoritma yang diberikan :
Menganalisa, bukan mencoba-coba. Dalam soal OSK maupun OSP, akan lebih cepat kita
mendapatkan jawaban apabila kita berusaha mengerti apa yang dilakukan suatu algoritma,
dibandingkan mencoba-coba dengan banyak data untuk mencari polanya. Tetapi apabila
analisa dalam algoritma tersebut cukup rumit, mencoba-coba dengan data yang kecil
(seperti menggunakan bilangan 0, 1, -1) akan membantu analisa kita.
Mengerjakan dalam variabel. Alasan kita perlu mengerjakannya dalam variabel (tidak
digantikan dengan bilangan) adalah karena mungkinnya suatu fungsi dilakukan secara
berulang kali, sehingga pada akhirnya kita akan menemukan suatu rumus umum yang bisa
kita gunakan berulang kali tanpa melakukan tracing setiap kali kita menggunakan fungsi
tersebut.
Contoh :
function ALC(x,y:integer):integer;
begin
if (x<y) then ALC:=x
else ALC:=y;
end;
begin
ans:=0;
for i:=1 to N do
ans:=ans+ALC(i,i+1);
writeln(ans);
end.
Kemudian pada soal dikatakan, berapakah output dari program tersebut apabila N=10?
Mungkin melakukan tracing dan menjalankan fungsi ALC sebanyak 10 kali masih masuk akal.
Tetapi apabila kita analisa, nilai yang dikembalikan oleh fungsi ALC adalah selalu yang terendah,
dengan kata lain ALC(x,y)=min(x,y). Kemudian apabila kita analisa pada program inti, dimana kita
akan menjumlahkan semua ALC(i,i+1). Kita ketahui bahwa min(i,i+1)=i, sehingga soal ini tidak lain
adalah menjumlahkan semua nilai i, yaitu 1+2+3+...+N. Kemudian kita dapat menggunakan rumus
deret aritmetika dan mendapatkan bahwa keseluruhan program tersebut akan mengoutputkan
N*(N+1)/2.
Keuntungan dari memperoleh rumus umum tersebut adalah, apabila pada soal selanjutnya
ditanyakan lagi dengan program yang sama dengan N=1000, apabila pada soal nomor
sebelumnya kita lakukan tracing, maka kita tidak bisa memperoleh apa-apa untuk soal ini. Tetapi
apabila kita sudah memperoleh rumus umumnya, kita dapat menggunakannya lagi untuk soal ini
dan menjawab 1000*1001/2=500500 dengan mudah. Hal ini yang mengakibatkan meskipun
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 8
dengan perulangan yang cukup besar tetapi soal-soal OSK dan OSP masih dapat dikerjakan
dalam durasi yang ada. Alhasil waktu yang terhemat cukup banyak dan kita mendapatkan benar
untuk 2 soal sekaligus.
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 8
SOAL
function ghi(x:integer;b:integer):integer;
begin
if (b=1) then ghi := x
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 8
5. Apabila bagian {a} diubah menjadi abc := a*2-(a mod 5), maka berapakah hasil
pemanggilan fungsi def(7,5) ?
A. 1
B. 7
C. 9
D. 43
E. 49
6. Apabila bagian {b} diubah menjadi def := ghi(a,b) mod 10, maka berapakah hasil
pemanggilan fungsi def(5,1) ?
A. 1
B. 3
C. 5
D. 7
E. 9
begin
x:=5;
y:=3;
ayam(x,y);
writeln(x-y);
end.
begin
num1:=x; num2:=y;
dare:=0; temp:=1;
while(num1>0 OR num2>0) do begin
if(num1 mod 2 + num2 mod 2 = 1) then
dare:=dare+temp
else
dare:=dare+((num1 mod 2 + num2 mod 2) * temp);
num1 := num1 div 2;
num2 := num2 div 2;
temp := temp * 2;
end;
poi:=dare;
end.
13. Berikut ini mana yang ekuivalen dengan nilai dari poi(A,B)? (jawaban dalam A dan B)
A. Penjumlahan dari A dan B
B. Pengurangan dari A dan B
C. Perkalian dari A dan B
D. Pembagian dari A dan B
E. Tidak ada jawaban yang benar
end;
for i:=1 to 6 do write(A[i]);
end.
15. Apabila baris yang bertanda {1} diganti dengan if (A[i]>A[j]) then, maka output dari
program diatas adalah
A. 111111
B. 123456
C. 135246
D. 654321
E. 666666
19. Agar output yang dihasilkan setelah pemanggilan order(1) adalah data yang terurut menaik,
maka nilai awal pada array data seharusnya adalah
A. 12345
B. 13524
C. 42513
D. 45231
E. 54321
24. Berikut ini manakah yang nilainya lebih besar dari 2018?
A. A(2,10)
B. B(32,63)
C. C(1009,1009)
D. D(2000,2000)
E. Tidak ada jawaban yang benar
bcd:=temp;
end;
PEMBAHASAN PAKET 7
1. Pada saat variabel a di assign dengan nilai pada variabel b, nilai dari a menjadi 3. Sehingga
saat varaibel b di assign dengan nilai pada variabel a (sudah menjadi 3), nilainya juga menjadi
3.
2. Karena 4 di modulo dengan 3 hasilnya 1 (bukan 2), maka program masuk ke cabang else.
3. Perhatikan bahwa a+b=b+c dan a*b=b*c akan bernilai true apabila a=c. Karena a tidak sama
dengan c, maka tidak masuk ke cabang if, sehingga nilai c tidak berubah.
4. Karena 13 lebih besar dari 12, maka program tidak mencetak P. Karena 13 modulo 7 = 6, maka
program masuk ke cabang else dan mencetak I.
6. Karena 1+2+3+...+n=n*(n+1)/2 (deret aritmetika), maka tanpa kita menjumlahkan satu per satu
kita bisa memperoleh jawabannya adalah 2018*2019/2. Apabila Anda malas menghitung,
perhatikan bahwa satuan dari pilihan yang ada semuanya berbeda. Dengan kata lain Anda
cukup mencari satuannya saja. 2018*2019/2 (mod 10) = 1009*2019 (mod 10) = 9*9 (mod 10) =
1.
7. Anda dapat membuat pertidaksamaan n*(n+1)/2 > 2018 dan menyelesaikannya. Tetapi apabila
Anda malas, coba satu per satu pilihan yang ada.
8. Program ini mencari banyaknya bilangan dari 1 hingga 2018 (inklusif) yang dapat dibagi 3 atau
5. Apabila Anda mempelajari paket-paket sebelumnya dengan baik, Anda pasti tahu bagaimana
solusi dari permasalahan ini. Hint : Teori Himpunan.
9. Anda dapat melakukan bruteforce (anak-anak OSN Komputer sering menyebutnya dengan
istilah „kuli‟).
10. Perhatikan bahwa program tersebut mirip dengan program untuk mencari faktorisasi prima
(dengan i sebagai faktor prima, dan cnt sebagai pangkatnya). Jawaban yang ada adalah hasil
kali dari semua pangkat di tambah dengan 1. Nilai tersebut sama dengan banyak faktor dari
suatu bilangan.
12. Anda dapat melakukan Greedy. Pertama, faktorisasi prima kan dari 10 (10=2*5).
Berdasarkan rumus banyak faktor, kita akan menggunakan 2 buah prima dan pangkatkan prima
tersebut dengan 1 (2-1) dan 4 (5-1). Agar optimal, kita pangkatkan prima yang kecil dengan nilai
pangkat yang besar. Dengan kata lain 2^4 * 3^1.
13. Fungsi f(x) menentukan apakah x merupakan bilangan prima atau bukan dengan
memeriksa apakah ada bilangan dari 2 hingga sqrt(x) yang habis membagi x.
15. Perhatikan bahwa nilai (a,b) akan terus bergeser menjadi (b,a+b). Apabila dilanjutkan
terus, akan membentuk barisan Fibonacci.
17. Cara paling mudah untuk mengerjakan soal ini adalah kuli (bruteforce).
18. Coba satu per satu pilihan yang ada (di saat inilah Anda mulai sadar bahwa untuk lolos ke
OSP Komputer itu sebenarnya mudah :) ).
19. Perhatikan bahwa program tersebut mencari rata-rata dari A[l] hingga A[r]. Hati-hati bahwa
pembagian yang digunakan adalah div.
21. Algoritma yang digunakan dalam soal ini adalah “Prefix Sum”. Prefix sum menyimpan
cumulative sum (nilai jumlah dari awal hingga saat ini). Contoh : “1 3 2 3 5” -> “1 4 6 9 14”.
Salah satu kegunaan dari Prefix Sum adalah kita mengetahui jumlah dari suatu jangkauan
tanpa mengiterasi satu per satu menggunakan perulangan. Kita gunakan contoh sebelumnya :
apabila kita ingin mencari jumlah dari indeks 2 hingga 4 (3+2+3=8), kita dapat menggunakan
nilai pada prefix sum kita, yaitu indeks 4 dikurangi indeks 1 (9-1=8). Cara kerja ini sama dengan
pada saat Anda mencari banyaknya bilangan di antara L hingga R yang habis dibagi 3 (cara
Anda adalah banyaknya bilangan yang habis dibagi 3 dari 1 hingga R, yaitu floor(R/3) dikurangi
dengan banyaknya bilangan yang habis dibagi 3 dari 1 hingga L-1, yaitu floor((L-1)/3).
Nyatanya memang soal ini mencari hal tersebut, yaitu banyaknya bilangan di antara L
hingga R yang tidak “habis dibagi 7 atau 2”. Anda dapat mencari terlebih dahulu yang habis
dibagi 7 atau 2, kemudian jawabannya adalah semuanya (R-L+1) dikurangi yang habis dibagi 7
atau 2.
26. Fungsi kuadrat(x) menentukan apakah x merupakan bilangan prima atau tidak. Hati-hati
bahwa terdapat sedikit kesalahan pada program tersebut, yaitu bilangan 1 masih tergolong
prima. Tentunya kesalahan itu adalah bagian dari soal untuk menjebak Anda yang kurang hati-
hati.
28. Fungsi kali(x,y) mengembalikan nilai x pangkat y. Perhatikan bahwa program tersebut
mencari nilai basis 10 dari array bit apabila diperlakukan sebagai basis n. 11111100010 basis 2
adalah 2018 basis 10.
30. Nilai x akan terus di update apabila ada nilai yang lebih besar dari dia. Dengan kata lain
program tersebut mencari nilai paling maksimum dari array A.
Sejak SD kelas 5, saya sudah mengikuti OSN yaitu di bidang matematika. Saat itu, saya bahkan belum
tau apa itu OSN. Beruntungnya, saat itu saya berhasil lolos ke tahap kabupaten dan meraih juara ke-2 di
kecamatan. Namun, langkah saya terhenti saat di kabupaten karena hanya meraih peringkat ke 12.
Beranjak SMP, saya pun kembali mengikuti OSN masih dibidang yang sama, yaitu matematika. Dari
SMP saya, hanya 1 orang yang dikirim untuk mengikuti seleksi kabupaten. Dan karena saya kalah saat
seleksi tingkat sekolah, maka saya tidak dapat mengikuti OSK.
Lanjut ke SMA kelas 10, kecintaan saya pada matematika pun berlanjut. Saya memilih bidang
matematika untuk olimpiade. Namun, kejadian yang terjadi di SMP terulang kembali. Saya gagal saat
mengikuti seleksi tingkat sekolah. Setelah itu, saya pun berpikir untuk pindah bidang saat kelas 11. Saya
pun berkonsultasi dengan orang tua serta guru pembimbing. Akhirnya, saya pun memilih bidang ekonomi.
Saat kelas 11, awalnya saya masih setengah hati mengikuti ekonomi. Karena saya yang
notabenenya anak IPA, saya merasa bahwa Iekonomi merupakan IPS. Ternyata, pemikiran saya salah.
Materi pertama yang saya dapatkan adalah permintaan, penawaran, dan elastisitas. Materi tersebut berisi
tentang kurva-kurva dan juga diferensial. Saya mulai semangat mengikuti tutor ekonomi. Dan akhirnya,
saya masuk ke tim yang akan mengikuti OSK meskipun saya hanya peringkat 3 dari 3 orang yang dikirim.
Saat OSK, saya terkejut karena melihat beberapa soal yang diluar dugaan dan tidak bisa saya
jawab. Selesai mengerjakan OSK saya berpikir bahwa saya tidak akan lolos. Ternyata saya lolos dan lagi-lagi
peringkat saya dibawah kedua teman satu sekolah saya. Lanjut ke tahap pra-OSP, dari 125 orang akan
diambil 50 orang. Mekanisme yang digunakan berbeda, yaitu +2 untuk setiap jawaban yang benar, -1 untuk
jawaban salah, dan 0 jika tidak menjawab. Pra-OSP tahun 2016 tidak ada essaynya. Tidak perlu menunggu
waktu lama untuk mengetahui siapa yang masuk 50 besar, sekitar 2 hari setelah pra-OSP pengumumannya
keluar dan saya mendapatkan urutan ke 19. Saya juga senang karena untuk pertama kalinya saya bukan
peringkat paling bawah diantara kami bertiga. Teman saya peringkat 9, dan teman saya yang satunya lagi
peringkat 22.
Setelah pra-OSP, ada pelatda selama 10 hari. Saya hanya berpikir bagaimana caranya saya yang
peringkat 19, menggeser pesaing-pesaing diatas saya dan dapat masuk ke tim OSN DKI Jakarta. Maka dari
itu saya mengikuti pelatihan dengan serius dan bertekad ingin lolos ke tingkat nasional. Setelah 10 hari
pelatihan, saat yang menentukan pun datang. Pelaksanaan OSP benar-benar membuat saya gugup, karena
dari 50 orang hanya akan diambil maksimal 8 orang. Setelah mengerjakan soal OSP yang menurut saya
sangat sulit, saya pun sedikit putus asa. Namun saya tidak ingin memikirkannya. Yang saya lakukan
setelahnya hanyalah berdoa agar bisa lolos ke tahap nasional.
Menunggu pengumuman OSN sangatlah menyebalkan. Kalau tidak salah, sekitar 2 minggu baru
diumumkan. Saat pengumuman keluar, saya pun berteriak kegirangan karena lolos. Dan beruntungnya,
saya lolos dengan peringkat 8 dari 8 orang yang lolos ke tahap nasional. Saya pun langsung memberitahu
orang tua saya. Saya sangat senang karena dapat menjadi siswa pertama yang lolos ke nasional di bidang
ekonomi dari SMAN Unggulan MH Thamrin.
PELATIHAN ONLINE 2018
KOMPUTER – PAKET 8
OSN 2016 dilaksanakan di Palembang. Banyak kejutan yang terjadi, salah satunya adalah waktu tes
yang berubah sesuka hati panitia. Misalnya tes tertulis, yang tadinya 3 jam dirubah menjadi kurang dari 2,5
jam. Begitu pula dengan waktu presentasi dan makalah, yang seharusnya 4 jam dirubah menjadi 2,5 jam.
Terlepas dari itu semua, saya menjadi punya banyak teman dari seluruh Indonesia, dari Aceh sampai Papua.
Tibalah saat yang ditunggu, yaitu pengumuman peraih medali. Awalnya saya merasa gugup karena
nama saya tidak ada di peraih medali perunggu, namun ternyata saat peraih medali perak nama saya
dipanggil. Itu merupakan salah satu momen terbaik dalam hidup saya. Saya sangat bersyukur kepada tuhan,
dan juga berterima kasih kepada orang tua, guru di sekolah, pelatih dari ALC terutama Ka Irfan dan Ka Dedi.
Dari pengalaman ini, saya belajar bahwa untuk menggapai sesuatu yang tinggi diperlukan
pengorbanan yang layak. Kegagalan saya di bidang matematika sejak SD, tidak membuat saya putus asa dan
akhirnya mencoba hal baru, yaitu ekonomi. Selain itu, doa dari diri sendiri dan keluarga juga menjadi faktor
yang menentukan. Karena tanpa rahmat dari-Nya, tentu saja tidak akan ada hasil yang memuaskan.