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.

TahapAktivitasWaktuTujuan
1Baca problem statement10 mntPahami soal sepenuhnya
2Brute force sendiri15 mntValidasi pemahaman, jangkar baseline
3Baca hint high-level5 mntDapat arah tanpa spoiler kode
4Attempt implementasi30 mntCoba ide dari hint
5Baca kode editorial10 mntHanya bila stuck setelah tahap 4
6Bedah perbedaan15 mntBandingkan dengan solusi sendiri
7Re-attempt tanpa lihat25 mntKonsolidasi 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:

  1. Validasi pemahaman soal — bila tidak bisa brute force, kita belum paham soalnya.
  2. Baseline untuk verifikasi — solusi optimal bisa dicek terhadap brute force pada kasus kecil.
  3. Identifikasi bottleneck — bagian mana yang membuat brute force lambat? Itu adalah target optimasi.

Kode: Framework Editorial Reader #

cpp
#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:

text
=== 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 #

  1. struct EditorialStage { string name; string description; int time_min; }: model data untuk satu tahap framework. Pemisahan name dan description memungkinkan display compact di tabel dan detail di section terpisah.
  2. vector<EditorialStage> editorialFramework() { return { ... }; }: fungsi pabrik yang mengembalikan daftar tahap. Memisahkan ke fungsi tersendiri membuat perubahan framework (mis. menambah tahap) terisolasi.
  3. cout << left << setw(35) << "Tahap" << setw(10) << "Menit" << "\n";: format tabel dengan alignment. left mengaktifkan alignment kiri, setw mengatur lebar kolom. Output menjadi rapi dan mudah dibaca.
  4. for (const auto& s : stages) { ... total += s.time_min; }: iterasi sambil akumulasi total waktu. const auto& menghindari copy struct — efisien untuk vektor objek.
  5. twoSumEditorialWalkthrough(): fungsi demo yang menerapkan framework pada soal konkret. Memilih Two Sum II karena sederhana namun mengandung pola two pointers yang umum.
  6. 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.
  7. vector<string> checklist = { ... };: daftar checklist sebagai vector string. Iterasi sederhana dengan nomor urut [i+1] mempermudah tracking manual.

Bahaya Copy-Paste Editorial #

Praktik BurukKonsekuensiSolusi
Copy paste kode editorial ke editorTidak ada pemahamanTulis ulang dari memori
Baca editorial sebelum coba sendiriTidak ada baselineSelalu brute force dulu
Baca seluruh kode sekaligusSpoiler solusiBaca hint dulu, kode terakhir
Tidak re-attempt setelah bacaIngatan jangka pendekWajib re-attempt keesokan hari
Tidak variasi soal serupaTidak generalisasi polaCari soal dengan pola sama
Hanya baca 1 editorialBias satu perspektifBandingkan beberapa editorial

Kapan Membaca Editorial #

Aturan praktis kapan waktu yang tepat:

SituasiTindakan
Stuck < 15 menitJangan baca editorial, coba lagi
Stuck 15–30 menitBaca hint high-level saja
Stuck 30–60 menitBaca hint + coba implementasi
Stuck > 60 menitBaca kode editorial, lakukan full framework
WA berulang (>3x)Stop, baca editorial untuk cari bug
TLECek kompleksitas, baca editorial untuk optimasi

Catat Pelajaran dalam “Editorial Journal” #

Setiap selesai baca editorial, catat dalam journal pribadi:

FieldContoh
ProblemLeetCode 167 — Two Sum II
TopicArray, Two Pointers
DifficultyMedium
PolaTwo pointers pada sorted array
Insight kunciSorted + cari pasangan => dua pointer
MistakeAwalnya coba binary search, terlalu rumit
Re-attemptBerhasil setelah 5 menit tanpa lihat

Journal ini menjadi referensi pribadi yang lebih bernilai daripada editorial external — karena berisi kesalahan kita sendiri.

Sumber Editorial Berkualitas #

PlatformKualitas EditorialBahasa
CodeforcesBervariasi per authorInggris/Rusia
LeetCodeStandar resmi + diskusi userInggris
AtCoderRingkas, padatInggris/Jepang
USACO GuideSangat lengkap dengan ilustrasiInggris
cp-algorithms.comEncyclopedia DSA untuk CPInggris

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.