Editorial soal DSA adalah pedang bermata dua. Baca terlalu cepat, kita hanya menghafal solusi tanpa memahami pola. Baca terlalu lambat, kita menghabiskan waktu yang seharusnya bisa untuk latihan soal lain. Framework yang baik: baca ide high-level dulu, coba implementasi sendiri, baru baca kode bila benar-benar stuck. Pada Chapter ini kita akan menyusun 7-tahap framework membaca editorial dengan estimasi waktu per tahap, lalu menerapkannya pada soal Two Sum II (sorted) untuk demonstrasi. Kita juga akan membahas aturan emas: editorial adalah alat bantu, bukan jawaban siap pakai.
Framework 7-Tahap Membaca Editorial #
Setiap soal yang menyebabkan stuck lebih dari 30 menit layak dibaca editorialnya. Tetapi proses membaca harus terstruktur — bukan sekadar konsumsi pasif.
| Tahap | Aktivitas | Waktu | Tujuan |
|---|---|---|---|
| 1 | Baca problem statement | 10 mnt | Pahami soal sepenuhnya |
| 2 | Brute force sendiri | 15 mnt | Validasi pemahaman, jangkar baseline |
| 3 | Baca hint high-level | 5 mnt | Dapat arah tanpa spoiler kode |
| 4 | Attempt implementasi | 30 mnt | Coba ide dari hint |
| 5 | Baca kode editorial | 10 mnt | Hanya bila stuck setelah tahap 4 |
| 6 | Bedah perbedaan | 15 mnt | Bandingkan dengan solusi sendiri |
| 7 | Re-attempt tanpa lihat | 25 mnt | Konsolidasi pemahaman |
Total: ~110 menit per soal. Bila lebih cepat, mungkin soal terlalu mudah; bila lebih lama, mungkin ada gap prasyarat.
Mengapa Brute Force Dulu? #
Brute force meskipun lambat (O(n²) atau O(2ⁿ)) memberi tiga manfaat:
- Validasi pemahaman soal — bila tidak bisa brute force, kita belum paham soalnya.
- Baseline untuk verifikasi — solusi optimal bisa dicek terhadap brute force pada kasus kecil.
- Identifikasi bottleneck — bagian mana yang membuat brute force lambat? Itu adalah target optimasi.
Kode: Framework Editorial Reader #
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>
using namespace std;
struct EditorialStage {
string name;
string description;
int time_min;
};
vector<EditorialStage> editorialFramework() {
return {
{"1. Baca problem statement", "Pahami soal sepenuhnya, catat input/output & edge case", 10},
{"2. Brute force sendiri", "Coba solusi brute force, walau O(n^2) atau lebih buruk", 15},
{"3. Baca hint high-level", "Skim editorial bagian ide/algoritma, tanpa kode", 5},
{"4. Attempt implementasi", "Coba coding sendiri berdasarkan ide", 30},
{"5. Baca kode editorial", "Hanya jika stuck > 30 menit atau WA berulang", 10},
{"6. Bedah perbedaan", "Bandingkan dengan solusi sendiri, catat pelajaran", 15},
{"7. Re-attempt tanpa lihat", "Hari berikutnya, coba selesaikan tanpa lihat editorial", 25},
};
}
// Contoh: pola editorial untuk soal Two Sum (sorted variant)
void twoSumEditorialWalkthrough() {
cout << "=== Contoh: Two Sum II (sorted) ===\n\n";
cout << "Soal: Diberi array terurut 'nums' dan target, kembalikan indeks (1-based)\n";
cout << "dua elemen yang berjumlah target. Asumsi solusi unik.\n\n";
cout << "Step 1 - Brute force O(n^2):\n";
cout << " for i in 0..n:\n";
cout << " for j in i+1..n:\n";
cout << " if nums[i]+nums[j] == target: return [i+1, j+1]\n\n";
cout << "Step 2 - Insight editorial (high-level):\n";
cout << " Array terurut + cari pasangan => two pointers\n";
cout << " Pointer kiri dari awal, kanan dari akhir\n";
cout << " Jika sum < target: geser kiri (perlu nilai lebih besar)\n";
cout << " Jika sum > target: geser kanan (perlu nilai lebih kecil)\n\n";
cout << "Step 3 - Implementasi optimal O(n):\n";
cout << " int left = 0, right = nums.size() - 1;\n";
cout << " while (left < right) {\n";
cout << " int sum = nums[left] + nums[right];\n";
cout << " if (sum == target) return {left+1, right+1};\n";
cout << " else if (sum < target) left++;\n";
cout << " else right--;\n";
cout << " }\n\n";
cout << "Step 4 - Pelajaran kunci:\n";
cout << " - 'Sorted array + pasangan/cari 2 elemen' => pertimbangkan two pointers\n";
cout << " - Dua pointer menghindari binary search per elemen (yang O(n log n))\n";
cout << " - Loop invarian: jika sum < target, perbesar left TIDAK akan skip solusi\n";
cout << " karena right sudah berada di elemen terbesar tersisa\n\n";
}
void checklistAvoidCopyPaste() {
cout << "=== Checklist: Hindari Copy-Paste Editorial ===\n\n";
vector<string> checklist = {
"Baca ide high-level dulu, tutup tab kode editorial",
"Tutup problem statement, coba coding sendiri 30 menit",
"Bila stuck, baca HINT editorial (bukan kode penuh)",
"Bila masih stuck, baca kode editorial SEKETIKA tutup lagi",
"Tulis ulang solusi dari memori, jangan copy paste",
"Hari berikutnya: re-attempt tanpa lihat editorial",
"Minggu berikutnya: variasi soal serupa (generalisasi)",
};
for (size_t i = 0; i < checklist.size(); ++i) {
cout << " [" << (i+1) << "] " << checklist[i] << "\n";
}
}
int main() {
cout << "=== Framework Membaca Editorial ===\n\n";
auto stages = editorialFramework();
int total = 0;
cout << left << setw(35) << "Tahap" << setw(10) << "Menit" << "\n";
cout << "----------------------------------|--------\n";
for (const auto& s : stages) {
cout << left << setw(35) << s.name << s.time_min << "\n";
total += s.time_min;
}
cout << "\nTotal estimasi waktu: " << total << " menit per soal\n\n";
twoSumEditorialWalkthrough();
checklistAvoidCopyPaste();
cout << "\n=== Aturan Emas ===\n";
cout << "- Editorial adalah alat bantu, bukan jawaban siap pakai\n";
cout << "- Tujuan: memahami POLA, bukan menghafal SOLUSI\n";
cout << "- Bila setelah baca editorial masih tidak bisa re-attempt: gap pemahaman\n";
cout << " di prasyarat. Mundur ke topik dasar.\n";
return 0;
}Output yang Dihasilkan:
=== Framework Membaca Editorial ===
Tahap Menit
----------------------------------|--------
1. Baca problem statement 10
2. Brute force sendiri 15
3. Baca hint high-level 5
4. Attempt implementasi 30
5. Baca kode editorial 10
6. Bedah perbedaan 15
7. Re-attempt tanpa lihat 25
Total estimasi waktu: 110 menit per soal
=== Contoh: Two Sum II (sorted) ===
Soal: Diberi array terurut 'nums' dan target, kembalikan indeks (1-based)
dua elemen yang berjumlah target. Asumsi solusi unik.
Step 1 - Brute force O(n^2):
for i in 0..n:
for j in i+1..n:
if nums[i]+nums[j] == target: return [i+1, j+1]
Step 2 - Insight editorial (high-level):
Array terurut + cari pasangan => two pointers
Pointer kiri dari awal, kanan dari akhir
Jika sum < target: geser kiri (perlu nilai lebih besar)
Jika sum > target: geser kanan (perlu nilai lebih kecil)
Step 3 - Implementasi optimal O(n):
int left = 0, right = nums.size() - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum == target) return {left+1, right+1};
else if (sum < target) left++;
else right--;
}
Step 4 - Pelajaran kunci:
- 'Sorted array + pasangan/cari 2 elemen' => pertimbangkan two pointers
- Dua pointer menghindari binary search per elemen (yang O(n log n))
- Loop invarian: jika sum < target, perbesar left TIDAK akan skip solusi
karena right sudah berada di elemen terbesar tersisa
=== Checklist: Hindari Copy-Paste Editorial ===
[1] Baca ide high-level dulu, tutup tab kode editorial
[2] Tutup problem statement, coba coding sendiri 30 menit
[3] Bila stuck, baca HINT editorial (bukan kode penuh)
[4] Bila masih stuck, baca kode editorial SEKETIKA tutup lagi
[5] Tulis ulang solusi dari memori, jangan copy paste
[6] Hari berikutnya: re-attempt tanpa lihat editorial
[7] Minggu berikutnya: variasi soal serupa (generalisasi)
=== Aturan Emas ===
- Editorial adalah alat bantu, bukan jawaban siap pakai
- Tujuan: memahami POLA, bukan menghafal SOLUSI
- Bila setelah baca editorial masih tidak bisa re-attempt: gap pemahaman
di prasyarat. Mundur ke topik dasar.Bedah Kode Baris-per-Baris #
struct EditorialStage { string name; string description; int time_min; }: model data untuk satu tahap framework. Pemisahannamedandescriptionmemungkinkan display compact di tabel dan detail di section terpisah.vector<EditorialStage> editorialFramework() { return { ... }; }: fungsi pabrik yang mengembalikan daftar tahap. Memisahkan ke fungsi tersendiri membuat perubahan framework (mis. menambah tahap) terisolasi.cout << left << setw(35) << "Tahap" << setw(10) << "Menit" << "\n";: format tabel dengan alignment.leftmengaktifkan alignment kiri,setwmengatur lebar kolom. Output menjadi rapi dan mudah dibaca.for (const auto& s : stages) { ... total += s.time_min; }: iterasi sambil akumulasi total waktu.const auto&menghindari copy struct — efisien untuk vektor objek.twoSumEditorialWalkthrough(): fungsi demo yang menerapkan framework pada soal konkret. Memilih Two Sum II karena sederhana namun mengandung pola two pointers yang umum.- Pseudocode di
cout << "Step 1 - Brute force O(n^2):\n";: pseudocode (bukan kode lengkap) lebih cocok untuk editorial — fokus pada algoritma, bukan sintaks. Pembaca dapat menerjemahkan ke bahasa apa pun. vector<string> checklist = { ... };: daftar checklist sebagai vector string. Iterasi sederhana dengan nomor urut[i+1]mempermudah tracking manual.
Bahaya Copy-Paste Editorial #
| Praktik Buruk | Konsekuensi | Solusi |
|---|---|---|
| Copy paste kode editorial ke editor | Tidak ada pemahaman | Tulis ulang dari memori |
| Baca editorial sebelum coba sendiri | Tidak ada baseline | Selalu brute force dulu |
| Baca seluruh kode sekaligus | Spoiler solusi | Baca hint dulu, kode terakhir |
| Tidak re-attempt setelah baca | Ingatan jangka pendek | Wajib re-attempt keesokan hari |
| Tidak variasi soal serupa | Tidak generalisasi pola | Cari soal dengan pola sama |
| Hanya baca 1 editorial | Bias satu perspektif | Bandingkan beberapa editorial |
Kapan Membaca Editorial #
Aturan praktis kapan waktu yang tepat:
| Situasi | Tindakan |
|---|---|
| Stuck < 15 menit | Jangan baca editorial, coba lagi |
| Stuck 15–30 menit | Baca hint high-level saja |
| Stuck 30–60 menit | Baca hint + coba implementasi |
| Stuck > 60 menit | Baca kode editorial, lakukan full framework |
| WA berulang (>3x) | Stop, baca editorial untuk cari bug |
| TLE | Cek kompleksitas, baca editorial untuk optimasi |
Catat Pelajaran dalam “Editorial Journal” #
Setiap selesai baca editorial, catat dalam journal pribadi:
| Field | Contoh |
|---|---|
| Problem | LeetCode 167 — Two Sum II |
| Topic | Array, Two Pointers |
| Difficulty | Medium |
| Pola | Two pointers pada sorted array |
| Insight kunci | Sorted + cari pasangan => dua pointer |
| Mistake | Awalnya coba binary search, terlalu rumit |
| Re-attempt | Berhasil setelah 5 menit tanpa lihat |
Journal ini menjadi referensi pribadi yang lebih bernilai daripada editorial external — karena berisi kesalahan kita sendiri.
Sumber Editorial Berkualitas #
| Platform | Kualitas Editorial | Bahasa |
|---|---|---|
| Codeforces | Bervariasi per author | Inggris/Rusia |
| LeetCode | Standar resmi + diskusi user | Inggris |
| AtCoder | Ringkas, padat | Inggris/Jepang |
| USACO Guide | Sangat lengkap dengan ilustrasi | Inggris |
| cp-algorithms.com | Encyclopedia DSA untuk CP | Inggris |
Ringkasan #
- Framework 7-tahap membaca editorial memastikan pembelajaran terstruktur.
- Brute force dulu sebelum baca editorial — validasi pemahaman dan dapat baseline.
- Baca hint high-level sebelum kode penuh — hindari spoiler.
- Re-attempt keesokan hari tanpa lihat editorial untuk konsolidasi memori.
- Catat pelajaran dalam journal pribadi — lebih bernilai daripada editorial external.
- Tujuan: memahami pola, bukan menghafal solusi spesifik.