Mengenal Soal OSN · Pelajaran 2 dari 10

Soal logika dan analitika

9 menit baca · BelajarCode

Soal logika OSN biasanya memberikan beberapa pernyataan lalu meminta kesimpulan. Teknik paling andal adalah analisis kasus: coba setiap kemungkinan, lalu buang yang bertentangan dengan pernyataan.

Contoh 1: siapa yang jujur?

Ada tiga siswa: Andi, Budi, dan Cici. Salah satu dari mereka mengambil spidol kelas.

  • Andi berkata: "Budi yang mengambil."
  • Budi berkata: "Bukan aku."
  • Cici berkata: "Bukan aku."

Diketahui hanya satu yang berkata jujur. Siapa yang mengambil spidol?

Analisis kasus
Jika pelakunyaAndi jujur?Budi jujur?Cici jujur?Banyak yang jujur
AndiTidakYaYa2
BudiYaTidakYa2
CiciTidakYaTidak1

Hanya kasus "Cici pelakunya" yang membuat tepat satu orang jujur. Jawabannya Cici.

Kalau ragu dengan jawabanmu, cara berpikir yang sama bisa diperiksa dengan program:

Python
1siswa = ["Andi", "Budi", "Cici"]2for pelaku in siswa:3    pernyataan = [4        pelaku == "Budi",5        pelaku != "Budi",6        pelaku != "Cici",7    ]8    if sum(pernyataan) == 1:9        print("Pelakunya:", pelaku)
Keluaran
Pelakunya: Cici

sum pada list berisi True dan False menghitung banyaknya True, karena True bernilai 1.

Contoh 2: urutan antrean

Lima siswa, yaitu Andi, Budi, Cici, Dodi, dan Euis, mengantre di kantin.

  1. Budi tepat di belakang Andi.
  2. Cici tidak berada di ujung antrean.
  3. Dodi di depan Euis.
  4. Euis bukan yang paling belakang.
  5. Andi bukan yang paling depan.
  6. Cici bersebelahan dengan Dodi.

Mulailah dari syarat yang paling mengikat: pasangan Andi dan Budi (syarat 1) hanya bisa di posisi 2 dan 3, 3 dan 4, atau 4 dan 5.

  • Andi 2, Budi 3: sisa posisi 1, 4, 5. Cici harus di 4 (syarat 2), Dodi di 1 dan Euis di 5. Melanggar syarat 4.
  • Andi 3, Budi 4: sisa posisi 1, 2, 5. Cici harus di 2, Dodi di 1 dan Euis di 5. Melanggar syarat 4.
  • Andi 4, Budi 5: sisa posisi 1, 2, 3. Jika Cici di 3, Dodi di 1 dan Euis di 2, tetapi Cici tidak bersebelahan dengan Dodi. Jadi Cici di 2, Dodi di 1, Euis di 3.

Jawabannya: Dodi, Cici, Euis, Andi, Budi.

Python
1from itertools import permutations23nama = ["Andi", "Budi", "Cici", "Dodi", "Euis"]4for urutan in permutations(nama):5    pos = {n: i + 1 for i, n in enumerate(urutan)}6    if (pos["Budi"] == pos["Andi"] + 17            and pos["Cici"] not in (1, 5)8            and pos["Dodi"] < pos["Euis"]9            and pos["Euis"] != 510            and pos["Andi"] != 111            and abs(pos["Cici"] - pos["Dodi"]) == 1):12        print(urutan)
Keluaran
('Dodi', 'Cici', 'Euis', 'Andi', 'Budi')

permutations mencoba semua 120 susunan antrean. Program hanya mencetak susunan yang memenuhi keenam syarat, dan ternyata hanya ada satu.

Strategi umum

Tulis semua syarat dengan simbol singkat, mulai dari syarat yang paling membatasi, lalu buat tabel kemungkinan. Saat lomba tanpa komputer, cara manual ini yang kamu pakai. Programnya berguna untuk memeriksa saat berlatih.

Cek pemahaman

Ada empat kemungkinan jawaban dan kamu sudah membuktikan tiga di antaranya bertentangan dengan soal. Apa kesimpulannya?

Latihan

Kotak berlabel salah

Ada tiga kotak berlabel "Apel", "Jeruk", dan "Campur". Semua label salah. Kamu boleh mengambil satu buah dari satu kotak tanpa melihat isinya. Dari kotak mana kamu harus mengambil supaya bisa menentukan isi ketiga kotak?

Jalankan contoh kode di pelajaran ini tanpa instalasi lewat compiler Python online.

Tandai pelajaran ini selesai

Masuk ke aplikasi untuk mencatat kemajuan, lalu lanjutkan ke pelajaran berikutnya dari perangkat mana pun.

Buka di aplikasi