অ্যারের দ্বিতীয় সর্বোচ্চ সংখ্যা?

আমি জাভা একদমই পারি না। নতুন শেখা আমার।
শিখতে আমার ভালোই লাগে, তাই প্যারা খাই না খুব একটা। কিন্তু ম্যাথ করতে গেলে খুব পেইন খাই একচোট। তো এবার আমার অব্জেক্ট অরিয়েন্টেড প্রোগ্রামিং ল্যাবরেটরি রিটেক কোর্স। এইটা রিটেক খাওয়ার অন্যতম কারন আমি মিড অ্যাসাইনমেন্ট দেই নাই। আর ফ্যাকাল্টি সুন্দর করে এফ গ্রেড দিয়ে দিছে। 

যাহোক, রিটেক কোর্সে আমার সেকেন্ড দিন ক্লাসের। স্যার একটা ছোট প্রব্লেম দিয়ে বললেন এইটা সল্ভ করো। প্রব্লেমটা খুবই সিম্পল। 

স্যার একটা নাম্বারের অ্যাারে দিলেন, খুবই সিম্পল।

[6,9,3,7,2,8]

বললেন এইটা থেকে যদি আমরা সবচেয়ে বড় নাম্বারটা পেতে চাই, কি করতে হবে। সব নার্ডের উত্তর, "স্যার, শর্টিং খড়লেই হয়ে যাবেহ"

স্যার বললেন, "হ্যা, শর্টিং করলে হবে, আচ্ছা। এবার যদি সবচেয়ে বড় নাম্বারের ছোট নাম্বারটা পেতে যাই তবে?" সোজা উত্তর, "স্যার, শর্টিং করে সবচেয়ে শেষের এলিমেন্টের আগের এলিমেন্টটাই হবে"

 এইবার স্যার একটা টুইস্ট দিলেন, বললেন, "যদি অ্যাারেটা এমন হয় তাহলে কিভাবে সবচেয়ে বড় নাম্বার আর তার ছোট নাম্বারটা বের করবে?" বলে স্যার আর একটা অ্যারে দিলেন। 

[6,9,3,7,2,8,3,15,15,15,19,16,16,16,16,16,16]

এইবার অনেককে একটু মাথা চুলকাতে দেখা গেলো। আমিও মাথা চুলকাইলাম। এবং সফলভাবে ফেইল করলাম। বাসায় আইসা ট্রাই দেবার পরে দেখলাম ৫ মিনিটে সল্ভ হয়ে গেলো। আমার মনে হয় ক্লাসেই মাথায় পড়া ঢোকে না 😂

আচ্ছা, এবার আমরা সল্ভ করি। প্রশ্নটা হলো, একটা ইন্টিজার অ্যারে দেয়া আছে। এইবার এইটার সবচেয়ে বড়, এবং তার ইমিডিয়েট ছোট নাম্বারটা দরকার।

তো আমরা প্রথমে একটা ফ্লো-চার্ট চিন্তা করি।

প্রথম থেকে,

  • একটা এলোমেলো  নাম্বার অ্যাারে দেয়া আছে
  • নাম্বার অ্যাারে-টা শর্টিং করে ঠিকঠাক করে ছোট থেকে বড় অর্ডারে সাজাবো। 
  • তারপর সবার শেষের নাম্বারটাই হবে সবচেয়ে বড় নাম্বার।
  • তারপর সবার শেষের নাম্বারের সাথে তার আগের নাম্বারের তুলনা করে দেখবো দুইটা একই সংখ্যা কিনা, যতক্ষন পর্যন্ত এই দুইটা সংখ্যা একই আসবে, আমি দ্বিতীয় সর্বোচ্চ সংখ্যা এক ঘর করে উলটা দিক থেকে পেছাতে থাকবো।
  • যখন দুইটাতে অমিল পাওয়া যাবে, তার মানে দ্বিতীয় সর্বোচ্চ সংখ্যা আমরা পেয়ে গেছি। 

এই পর্যন্ত হলো আমার একটা রাফ ফ্লো-চার্টের ভাবনা। এইবার তাহলে কোড লেখা যাক। আমি এইটা জাভা দিয়ে কোড করবো। অ্যালগরিদম সব প্রোগ্রামিং ল্যাঙ্গুয়েজে একই, সিন্ট্যাক্সটা একটু আলাদা হবে আরকি। 

import java.util.Arrays;

public class ArraySecondLargestNumber {
    public static void main(String[] args) {

        int arr[] = {6,9,3,7,2,8,3,15,15,15,19,16,16,16,16,16,16};
        int temp = 0;

        System.out.println("Elements of original array:");
        System.out.println(Arrays.toString(arr) + "\n");

        //Bubble Sort Algorithm
        System.out.println("Lets Sort the array");
        for (int i = 0; i < arr.length; i++) {
            for(int j = i+1; j < arr.length; j++){
                if(arr[i] > arr[j]){
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr) + "\n");


        System.out.println("Lets Find out the largest Number");

        var firstLargest = arr[arr.length - 1];
        var secondLargest = arr[arr.length - 2];

        if(firstLargest == secondLargest){
            for (int k = arr.length - 1; k > 0; k--){
                if(secondLargest == firstLargest){
                    secondLargest = arr[k-1];
                }else{
                    break;
                }
            }
        }

        System.out.println("First Largest: " + firstLargest);
        System.out.println("Second Largest: " + secondLargest);
    }
}


এখানে প্রোগ্রামটা খুবই সিম্পল। সি প্রোগ্রাম দিয়ে করা যেতো। কিন্তু আমি জাভা এঞ্জয় করি, সময় খুব কম থাকলে প্র্যাক্টিস করতে জাভাস্ক্রিপ্ট ইউজ করি। যাহোক, প্রথমে আমরা ইন্টিজার অ্যারে ডিক্লার করে নিলাম, তারপরে অ্যারের এলিমেন্টগুলো একবার প্রিন্ট করলাম যাতে আমরা পরিবর্তনটা সহজে দেখতে পারি। 

তারপরে বাবল শর্ট অ্যালগরিদম ব্যাবহার করে অ্যারেটাকে সাজিয়ে নিলাম। এইটা মোটামোটি সবাই আমরা জানি। তাও আরেকটা পোস্টে লিখবো কিভাবে বাবল শর্ট অ্যাল্গরিদম কাজ করে। 

যাহোক, শর্টিং করার পরে অ্যারের শেষ নাম্বারটাকে আমি ধরে নিয়েছি সবচেয়ে বড় নাম্বার হিসেবে। লজিক্যালি এইটাই সত্য ক্রমবর্ধমান ক্রমে (মানে অ্যাসেন্ডিং অর্ডারে) শর্টিং করার পরে শেষ নাম্বারটা হবে সবচেয়ে বড়।

সবচেয়ে বড় নাম্বারটা আমি রেখেছি firstLargest ভ্যারিয়েবলে array[array.length -  1] দিয়ে। এবার আমি জাস্ট ধরে নেবো সবচেয়ে বড় নাম্বারের আগেরটাই দ্বিতীয় সর্বোচ্চ সংখ্যা, মানে array[array.length -  2], জাস্ট ধরে নেবো, এখন নাও হতে পারে সেটা। তো দ্বিতীয় সর্বোচ্চ নাম্বারটাকে  আমি রাখলাম secondLargest ভ্যারিয়েবলে।

এবার শুরু হবে আরেকটা কাজ, আমি এবার একবার মিলিয়ে দেখবো যে দ্বিতীয় সর্বোচ্চ নাম্বারটা কি প্রথম সর্বোচ্চ নাম্বারের সাথে মিলে যায় নাকি। মানে if(firstLargest == secondLargest ) কি না?

যদি মিলে যায়, তাহলে দ্বিতীয় সর্বোচ্চ নাম্বারটার পয়েন্টার (secondLargest) এক ঘর করে পিছিয়ে দেবো। তারপর আবার চেক করে দেখবো যে প্রথম সর্বোচ্চ নাম্বারের সাথে দ্বিতীয় সর্বোচ্চ নাম্বার মিলে যায় নাকি। এভাবে লুপ চলতে থাকবে অ্যারের উলটো দিক থেকে যতক্ষন না অমিল পাওয়া যায়। 

অমিল পাওয়া মাত্র লুপ বন্ধ হয়ে যাবে এবং শেষ যে নাম্বারের সাথে অমিল পাওয়া গেছে, সেটাই হবে অ্যারের দ্বিতীয় সর্বোচ্চ সংখ্যা।

 

Post a Comment

Previous Post Next Post