Wyzwanie Java #4: Rozwiązanie

Radosław Szmit 11 maja 2018
 

Czas na wyniki naszego czwartego wyzwania. Tym razem mieliśmy do rozwiązania dwa zadania, jedno prostsze, drugie trudniejsze, wymagające od nas podstawowej znajomości struktur danych w języku Java i umiejętności pisania algorytmów z ich wykorzystaniem.

Zadanie nr 1

Zaczynamy od pierwszego zadania. Naszym celem było dla tablicy wejściowej input zawierającą liczby typu int zwrócić tablicę zawierającą ilość elementów ujemnych oraz sumę elementów dodatnich. Jeśli tablica była pusta lub null, wtedy należało zwrócić pustą tablicę.

To zadanie można było rozwiązać na kilka sposobów, jednym z nich jest:

package pl.kodolamacz;

public class JavaChallenge4Task1 {

    public static void main(String[] args) {
        int[] result = countAndSumElements(new int[]{1, 2, 3, 4, 5, -3, -2, -1});
        if (result.length == 2) {
            System.out.println("Liczb ujemnych: " + result[0]);
            System.out.println("Suma dodatnich: " + result[1]);
        }
    }

    public static int[] countAndSumElements(int[] input) {

        if (input == null || input.length == 0) return new int[0];

        var sum = 0;
        var count = 0;

        for (var element : input) {
            if (element > 0) sum += element;
            else if (element < 0) count++;
        }

        return new int[]{count, sum};
    }

}

Oprócz samej funkcji countAndSumElements dodaliśmy funkcję main pozwalającą nam w prosty sposób przetestować działanie naszej funkcji. W Javie można dużo sprawniej testować kod, jednak do tego wrócimy w innym poście.

Zadanie nr 2

W kolejnym zadaniu należało stworzyć algorytm sterujący pracą automatu z napojami. Zakładaliśmy, że automat przyjmuje monety 1zł, 2zł i 5zł. Puszka napoju kosztuje 1zł. Na starcie automat nie miał żadnych pieniędzy. Dla wskazanej listy wejściowej monet należało zwrócić true lub false w zależności czy automat będzie w stanie zwrócić resztę. Każda moneta była wrzucana przez innego klienta.

Tutaj już trzeba napisać znacznie więcej kodu, który realizował konkretny algorytm. Podstawowym problemem, który można popełnić w tym zadaniu, to zliczanie sumy pieniędzy w automacie, zamiast oddzielnie ilości monet każdego nominału. Niestety, gdy ktoś wrzuci 5zł a automat będzie miał tylko w sobie monetę 5zł, to mimo, że reszta 4zł jest mniejsza niż suma monet w środku, to nie da się wydać reszty. Z drugiej strony, zliczając monety, wystarczy wiedzieć ile było monet 1zł i 2zł, gdyż monety 5zł nigdy nie są zwracane jako reszta, stąd można to pominąć.

To zadanie również można było rozwiązać na kilka sposobów, jednym z nich jest:

public class JavaChallenge4Task2 {

    public static void main(String[] args) {
        System.out.println(vendingMachine(List.of(1, 2, 1, 2, 5))); // dla pięciu zwracamy dwie dwójki
        System.out.println(vendingMachine(List.of(1, 2, 1, 1, 5))); // dla pięciu zwracamy dwójkę i dwie jedynki
        System.out.println(vendingMachine(List.of(1, 1, 1, 1, 5))); // dla pięciu zwracamy cztery jedynki

        System.out.println(vendingMachine(List.of(1, 2, 2, 5, 2))); // błąd, nie da się wydać przy drugiej dwójce bo w autmacie jest tylko moneta 2 zł
    }

    public static boolean vendingMachine(List<Integer> coins) {
        int count1Pln = 0;
        int count2Pln = 0;

        for (var coin : coins) {

            if (coin == 1) {
                count1Pln++;
            } else if (coin == 2) {
                if (count1Pln >= 1) {
                    count2Pln++; // zostaje 2zł, wydaje 1zł
                    count1Pln--;
                } else {
                    return false; // Jeśli ktoś wrzucił 2zł muszę mieć minimum jedną monetę 1zł by wydać resztę inaczej false
                }
            } else if (coin == 5) {
                // zostaje 5zł, wydajęmy dwie dwójki lub dwójkę i dwie jedynki lub cztery jedynki, dokładnie w tej kolejności
                if (count2Pln >= 2) {
                    count2Pln -= 2;
                } else if (count2Pln >= 1 && count1Pln >= 2) {
                    count2Pln--;
                    count1Pln -= 2;
                } else if (count1Pln >= 4) {
                    count1Pln -= 4;
                } else {
                    return false; // Nie udało mi się wydać żadnej kombinacji...
                }
            } else {
                return false; // ktoś wrzucił nieprawidłową monetę!!!
            }

        }
        return true;
    }

}

Jeśli macie więcej pytań lub problemów, piszcie do nas śmiało na Facebooku, chętnie pomożemy. :) Do zobaczenia w poniedziałek na kolejnym wyzwaniu!

Radosław Szmit

Opiekun bootcampu Full-stack w Kodołamacz.pl. Inżynier oprogramowania, specjalista Big Data, trener IT. Absolwent Politechniki Warszawskiej aktualnie pracujący nad rozprawą doktorską z zakresu Big Data i NLP. Twórca polskiej wyszukiwarki internetowej NEKST stworzonej przez Instytut Podstaw Informatyki Polskiej Akademii Nauk oraz Otwartego Systemu Antyplagiatowego realizowanego przez Międzyuniwersyteckie Centrum Informatyzacji. Zawodowo konsultant IT specjalizujący się w rozwiązaniach Java Enterprise Edition, Big Data oraz Business Intelligence, trener IT w firmie Sages.
Komentarze
Ostatnie posty
Data Science News #204
Data Science News #203
Data Science News #202
Data Science News #201