Halo..

Selamat datang di CodecafeID.

Artikel ini adalah lanjutan dari artikel sebelumnya yaitu Kotlin Heroes 2020 Practice Day - Problem A. Saya akan melanjutkan untuk membahas soal selanjutnya yaitu Problem B - Square? dan akan tetap menggunakan 4 Langkah yang dibahas pada artikel sebelumnya. Yuk mulai!

NOTE: Soal competitive programming yang akan saya bahas kali ini disediakan dengan Bahasa Inggris

Bagi teman-teman yang ingin mengikuti Kotlin Heroes 2020 bisa daftar dengan klik link berikut: https://kotlinlang.org/

Problem B - Square?

time limit per test: 1 second
memory limit per test: 256 megabytes
input: standard input
output: standard output

Vasya claims that he had a paper square. He cut it into two rectangular parts using one vertical or horizontal cut. Then Vasya informed you the dimensions of these two rectangular parts. You need to check whether Vasya originally had a square. In other words, check if it is possible to make a square using two given rectangles.

Input

The first line contains an integer 𝑡 (1 ≤ 𝑡 ≤ 104) — the number of test cases in the input. Then 𝑡 test cases follow.

Each test case is given in two lines.

The first line contains two integers 𝑎1 and 𝑏1 (1 ≤ 𝑎1, 𝑏1 ≤ 100) — the dimensions of the first one obtained after cutting rectangle. The sizes are given in random order (that is, it is not known which of the numbers is the width, and which of the numbers is the length).

The second line contains two integers 𝑎2 and 𝑏2 (1 ≤ 𝑎2, 𝑏2 ≤ 100) — the dimensions of the second obtained after cutting rectangle. The sizes are given in random order (that is, it is not known which of the numbers is the width, and which of the numbers is the length).

Output

Print 𝑡 answers, each of which is a string “YES” (in the case of a positive answer) or “NO” (in the case of a negative answer). The letters in words can be printed in any case (upper or lower).

Example

INPUT

3
2 3
3 1
3 2
1 3
3 3
1 3
OUTPUT

Yes
Yes
No

Teman-teman bisa membaca soal diatas dan memahaminya terlebih dahulu sebelum kita lanjut ke pembahasan.

Pembahasan

Oke, yuk kita lakukan 4 Langkah yang sudah kita pelajari di artikel sebelumnya.

1. Breakdown Narasi Masalah

Setelah kita membaca permasalahan yang ada di soal problem B diatas, saya dapat simpulkan masalahnya dengan lebih sederhana, seperti berikut:

“Vasya mengaku memiliki kertas persegi, kemudian dia memotong kertas tesebut menjadi 2 persegi panjang (bisa horizontal ataupun vertikal). Tugas kita adalah untuk mengetahui apakah kertas asli sebelum dipotong adalah persegi atau tidak. Penting: panjang dan lebar persegi panjang tidak berurutan

2. Buat Algoritma

Nah, kita telah mengerti inti dari permasalahannya setelah melakukan langkah pertama yaitu breakdown narasi masalah. Selanjutnya kita buat algoritma dengan bahasa sederhana.

Untuk membuat algoritma soal diatas mari kita pehatikan bagian berikut terlebih dahulu.

Karena pada soal dinyatakan bahwa panjang dan lebar masing-masing potongan (persegi panjang) tidak berurutan, maka kita memiliki 4 kondisi yaitu seperti gambar diatas.

Perhatikan sample test case 1 dan 2:

2 3
3 1
3 2
1 3

Dari test case tersebut kita menemukan pola yaitu:

  • Penjumlahan dari diagonal utama (analogi matriks) pada test case 1 kemudian dibandingkan dengan nilai disudut kanan atas dan nilai disudut kiri bawah.
  • Penjumlahan dari diagonal samping (analogi matriks) pada test case 2 kemudian dibandingkan dengan nilai disudut kiri atas dan nilai disudut kanan bawah.

Namun 2 kondisi diatas belum cukup untuk memenuhi semua test case. Kita pun juga harus melakukan hal berikut:

  • Menjumlahkan 2 angka disebelah kiri kemudian dibandingkan dengan 2 angka disebelah kanan dan sebaliknya.

Untuk lebih jelasnya perhatikan gambar berikut ini:

Sehingga diperoleh algoritma sebagai berikut:

Algoritma:

1. Sediakan sebuah variabel t dan 2 buah list untuk menampung ukuran persegi 1 dan persegi 2
2. Masukkan nilai t
3. Masukkan 2 buah nilai pada masing-masing list
4. Jika kondisi pertama, kedua, ketiga, atau keempat terpenuhi, tampilkan "YES"
5. Jika tidak ada kondisi yang terpenuhi, tampilkan "NO"
6. Ulangi langkah 3 sampai 5 sebanyak t kali

3. Terjemahkan Algoritma

Oke, algoritma untuk memecahkan masalah sudah ada. Langkah selanjutnya adalah mengkonversi algoritma diatas menjadi kode program. berikut contoh hasil terjemahan algoritma ke kode untuk masalah diatas:

Solusi:

import java.util.*

fun main() {
    val scanner = Scanner(System.`in`)
    val t = scanner.nextInt()
    val rec1 = mutableListOf<List<Int>>()
    val rec2 = mutableListOf<List<Int>>()
    for (i in 0 until t) {
        rec1.add(listOf(scanner.nextInt(), scanner.nextInt()))
        rec2.add(listOf(scanner.nextInt(), scanner.nextInt()))

        val first =
            rec1[i][0] + rec2[i][1] == rec1[i][1]
                    && rec1[i][0] + rec2[i][1] == rec2[i][0]
        val second =
            rec1[i][1] + rec2[i][0] == rec1[i][0]
                    && rec1[i][1] + rec2[i][0] == rec2[i][1]
        val third =
            rec1[i][0] + rec2[i][0] == rec1[i][1]
                    && rec1[i][0] + rec2[i][0] == rec2[i][1]
        val fourth =
            rec1[i][1] + rec2[i][1] == rec1[i][0]
                    && rec1[i][1] + rec2[i][1] == rec2[i][0]

        if (first || second || third || fourth) {
            println("Yes")
        } else {
            println("No")
        }
    }
}

4. Jalankan Test Case

Langkah terakhir adalah menjalankan kode kita dengan test case yang diberikan soal, jika semua sample test case terpenuhi maka kita dapat submit kode ke online judge. Berikut adalah hasil running sample test case pada Problem B:

Pada IDE (IntelliJ):

Karena hasil output yang didapatkan sudah sesuai dengan ekspektasi hasil dari sample test case, maka kita bisa submit ke online judge untuk di test pada test case sesungguhnya. Berikut hasilnya:

Accepted! Solusi kita untuk Problem B telah sukses berjalan dan memenuhi semua test case.

Oh iya, untuk teman-teman yang ingin belajar pemrograman dan konsep dari Computational Thinking dapat menuju link berikut: https://www.jetbrains.com/academy/

Sampai disini dulu artikel kali ini, saya akan update untuk problem C, D, dan E pada artikel terpisah. Terimakasih!

Buy me a coffeeBuy me a coffee