Informatika
Arsitektur Algoritma: Menguasai Sintaksis C++ dan Fondasi Pemrograman Kompetitif
Materi: Pemrograman Dasar & Algoritma | SMA
SOAL NOMOR 1
Dalam pemrograman kompetitif, tipe data manakah yang paling tepat digunakan di C++ untuk menyimpan bilangan bulat dengan rentang hingga $10^{18}$?
A. int
B. long long
C. float
D. double
PEMBAHASAN:
Tipe data 'int' biasanya hanya menampung hingga sekitar $2 \times 10^9$. Untuk angka hingga $10^{18}$, diperlukan 'long long' yang memiliki ukuran 64-bit.
SOAL NOMOR 2
Apa fungsi dari baris kode `std::ios_base::sync_with_stdio(false); cin.tie(NULL);` pada awal fungsi main?
A. Mengurangi penggunaan memori program
B. Mempercepat proses input dan output (I/O)
C. Mencegah terjadinya Runtime Error
D. Melakukan pengurutan data secara otomatis
PEMBAHASAN:
Kode tersebut memutus sinkronisasi antara stream C++ (cin/cout) dan C (stdin/stdout), yang secara signifikan mempercepat pembacaan data dalam jumlah besar.
SOAL NOMOR 3
Manakah kompleksitas waktu yang paling efisien untuk algoritma pencarian pada array yang sudah terurut?
A. O(N)
B. O(N log N)
C. O(log N)
D. O(1)
PEMBAHASAN:
Pencarian biner (Binary Search) pada data terurut memiliki kompleksitas $O(\log N)$, yang jauh lebih cepat daripada pencarian linear $O(N)$.
SOAL NOMOR 4
Struktur data STL di C++ yang menyimpan elemen secara unik dan otomatis terurut adalah ....
A. std::vector
B. std::list
C. std::set
D. std::queue
PEMBAHASAN:
'std::set' menggunakan implementasi Balanced Binary Search Tree (seperti Red-Black Tree) sehingga elemen di dalamnya selalu unik dan terurut.
SOAL NOMOR 5
Bagaimana cara mengakses elemen paling atas dari struktur data `std::stack` di C++?
A. s.front()
B. s.back()
C. s.top()
D. s.pop()
PEMBAHASAN:
Stack menggunakan prinsip LIFO (Last-In-First-Out). Fungsi 'top()' digunakan untuk melihat elemen terakhir yang dimasukkan tanpa menghapusnya.
SOAL NOMOR 6
Berapakah nilai dari `7 % -3` dalam standar bahasa pemrograman C++ (C++11 ke atas)?
A. 1
B. -1
C. 2
D. -2
PEMBAHASAN:
Dalam C++11 ke atas, hasil operasi modulo memiliki tanda yang sama dengan dividen (angka yang dibagi). Karena 7 positif, hasilnya adalah 1.
SOAL NOMOR 7
Operasi `v.push_back(x)` pada `std::vector` memiliki kompleksitas waktu rata-rata (amortized) sebesar ....
A. O(1)
B. O(log N)
C. O(N)
D. O(N^2)
PEMBAHASAN:
Menambahkan elemen ke akhir vektor secara rata-rata adalah waktu konstan, kecuali saat vektor harus melakukan alokasi ulang memori (resize).
SOAL NOMOR 8
Manakah fungsi yang digunakan untuk mengurutkan elemen array `A` sebanyak `N` elemen menggunakan library ``?
A. sort(A)
B. sort(A, N)
C. sort(A, A + N)
D. A.sort()
PEMBAHASAN:
Fungsi `std::sort` menerima dua iterator: posisi awal dan satu posisi setelah elemen terakhir yang ingin diurutkan.
SOAL NOMOR 9
Apa yang terjadi jika sebuah fungsi rekursif tidak memiliki 'base case'?
A. Program akan berjalan sangat cepat
B. Program akan berhenti dengan pesan sukses
C. Terjadi Stack Overflow (Runtime Error)
D. Hasil perhitungan akan selalu nol
PEMBAHASAN:
Tanpa base case, fungsi akan memanggil dirinya sendiri terus-menerus hingga memori stack habis, menyebabkan program crash.
SOAL NOMOR 10
Struktur data manakah yang menerapkan prinsip FIFO (First-In-First-Out)?
A. Stack
B. Queue
C. Priority Queue
D. Decomposition
PEMBAHASAN:
Queue (antrean) memastikan elemen yang pertama kali masuk adalah yang pertama kali keluar.
SOAL NOMOR 11
Simbol operator bitwise 'XOR' dalam C++ adalah ....
A. &
B. |
C. ^
D. ~
PEMBAHASAN:
Simbol '^' digunakan untuk operasi Exclusive OR (XOR). '&' untuk AND, '|' untuk OR, dan '~' untuk NOT.
SOAL NOMOR 12
Kompleksitas waktu dari algoritma pengurutan `std::sort()` di C++ adalah ....
A. O(N)
B. O(N^2)
C. O(N log N)
D. O(log N)
PEMBAHASAN:
std::sort menggunakan Introsort (kombinasi QuickSort, HeapSort, dan Insertion Sort) yang menjamin performa terburuk $O(N \log N)$.
SOAL NOMOR 13
Keyword `break` dalam struktur perulangan `for` berfungsi untuk ....
A. Meloncati satu iterasi dan lanjut ke iterasi berikutnya
B. Menghentikan paksa seluruh proses perulangan
C. Mengulang kembali perulangan dari awal
D. Keluar dari fungsi utama program
PEMBAHASAN:
`break` segera menghentikan perulangan di mana ia berada, sedangkan `continue` hanya meloncati sisa kode dalam iterasi saat ini.
SOAL NOMOR 14
Manakah cara yang benar untuk mendeklarasikan pair yang berisi string dan integer?
A. pair(string, int) p;
B. pair<string, int> p;
C. pair{string, int} p;
D. string.int pair p;
PEMBAHASAN:
Sintaks STL menggunakan kurung siku lancip (angle brackets) untuk mendefinisikan tipe data template.
SOAL NOMOR 15
Library yang harus di-include untuk menggunakan fungsi `sqrt()`, `abs()`, dan `pow()` adalah ....
A. <iostream>
B. <algorithm>
C. <cmath>
D. <vector>
PEMBAHASAN:
Library `` berisi fungsi-fungsi matematika standar untuk C++.