Ich habe es mit Java gelöst! !! Paiza-Übung "Long Table Unagiya"

Einführung

Dieser Artikel wurde von Anfängern in der Programmierung geschrieben. Was ist los, du solltest das mehr tun! !! Wenn Sie irgendwelche Fragen haben, Bitte kommentieren.

Diese Frage ist auch eine Paiza-Übung. Bitte seien Sie versichert, dass es nichts mit dem Rang nach oben oder unten zu tun hat.

Problem

Jetzt kommen m Gruppen von Menschen der Reihe nach zu ihren Plätzen. Sei a_i die Anzahl der Personen in der i-ten Gruppe (1 ≤ i ≤ m). Sie versuchen, in einer Reihe von a_i-Sitzen hintereinander auf dem langen Tisch zu sitzen.

Da der Kunde jedoch ein Edo-Kind ist, wenn einer dieser Sitze bereits vom vorherigen Kunden besetzt ist, Die ganze Gruppe wird wütend und geht nach Hause, ohne sich zu setzen. Edo Kind ist schnell.

In der Eingabe wird die Position aufeinanderfolgender Sitze, an denen die i-te Gruppe sitzen wird, durch die Ganzzahl b_i angegeben. Die i-te Gruppe startet vom Sitz mit der Sitznummer b_i und versucht, von dort aus im Uhrzeigersinn auf a_i-Sitzen zu sitzen.

Erstellen Sie ein Programm, das die Anzahl der Personen ausgibt, die sicher am langen Tisch sitzen, nachdem sich die letzte Gruppe gesetzt hat.

Wert eingegeben werden

Die Eingabe besteht aus m + 1 Zeilen. In der ersten Zeile werden n (Anzahl der Sitzplätze) und m (Anzahl der Gruppen) getrennt durch Leerzeichen halber Breite eingegeben. In der Zeile i + 1 (1 ≤ i ≤ m) werden zwei ganze Zahlen a_i (Anzahl der Personen in der Gruppe) und b_i (Anzahl der Sitzstartsitzplätze) getrennt durch ein Leerzeichen halber Breite eingegeben.

Ein Zeilenumbruch wird am Ende der letzten Zeile des Eingabewerts eingefügt. Die Zeichenfolge wird von der Standardeingabe übergeben.

Beispiel) 6 3 3 2 1 6 2 5

Erwartete Ausgabe

Nachdem sich die letzte Gruppe gesetzt hat, geben Sie bitte die Anzahl der Personen aus, die sicher in einer Zeile sitzen können.

Beispiel) 4

Bedingungen

1≦n≦100 1≦m≦100 1≦a_i≦n 1≦b_i≦n

Code mit 100 Punkten

package paiza;
import java.util.*;

public class unagiya {

	public static void main(String[] args) {
		/*
		 *Ermitteln Sie die Gesamtzahl der Sitzplätze im Geschäft und die Anzahl der Gruppen, die das Geschäft als String-Typ besuchen, und speichern Sie sie in der Zeile
		 *Die in Zeile gespeicherten Daten werden durch Teilen geteilt und in lineArray des String-Arrays gespeichert.
         */
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        String[] lineArray = line.split(" ");
        /*
         *Wandeln Sie die in lineArray gespeicherten Daten um und speichern Sie sie in jeder Variablen
         * 
         * seatNum:Anzahl der Sitze
         * totalGuest:Anzahl der Gruppen, die den Laden besuchen
        */
        int seatNum = castString(lineArray[0]);
        int totalGuest = castString(lineArray[1]);
        
        /*
         * seats:Erstellen Sie die Anzahl der Plätze mit hashMap
         *Ganzzahl ist die Sitznummer
         *Ob Boolean eine Person ist oder nicht(Wenn das stimmt, können Sie sich setzen,)
         */
        Map<Integer,Boolean> seats = new HashMap<>();
        for(int i = 1; i <= seatNum; i++){
            seats.put(i,true);
        }
        /*
         *isSitCustomer:Überprüfen Sie, ob sich auf dem vom Kunden ausgewählten Sitzplatz Personen befinden
         *Wenn nicht, werfen Sie wahr
         *
         * choiceSeat:Sitznummer, die der Basispunkt für Kunden ist
         *menberNum:Anzahl der Kunden, die gekommen sind
         */
        
        int choiceSeat = 0;
        int memberNum = 0;
        
        for(int i = 0; i < totalGuest; i++){
        	//Erhält den Eingabewert der Konsole
        	//Zuweisen zu memberNum und choiceSeat
            line = scanner.nextLine();
            lineArray = line.split(" ");
            
            memberNum = castString(lineArray[0]);
            choiceSeat = castString(lineArray[1]);
            
            //Wenn isSitGuest wahr ist, schreiben Sie die Sitzplatzinformationen des vom Kunden ausgewählten Sitzplatzes und die Anzahl der Personen auf falsch
            if(isSitGuest(seats,choiceSeat,memberNum)){
                for(int j = 0,index = 1 ; j < memberNum; j++){
                    if(seats.size() < choiceSeat + j){
                        seats.put(index, false);
                        index++;
                    } else {
                        seats.put(choiceSeat + j,false);
                    }
                }
            }
        }
        
        //Überprüfen Sie die falsche Anzahl von Sitzplatzinformationen und ersetzen Sie sie im Ergebnis
        int result = 0;
        
        for(int i = 1; i <= seats.size(); i++){
            if(seats.get(i).equals(false)){
                result++;
            }
        }
        System.out.println(result);
    }

	//Wandeln Sie eine String-Typ-Nummer in einen Int-Typ um
    public static int castString(String strNum){
        int num = Integer.parseInt(strNum);
        return num;
    }
    
    /*
     *Karte Sitzplatzinformationen erhalten, von Kunden ausgewählte Sitzplätze, Anzahl der Kunden,
     *Überprüfen Sie, ob die Anzahl der Kunden des vom Kunden ausgewählten Sitzplatzes falsch ist
     * 
     *Bedingungen
     *Gibt false zurück, wenn mehr Gäste als Sitzplätze vorhanden sind
     *Gibt false zurück, wenn die Sitzinformationen nur einen false enthalten
     */
    public static boolean isSitGuest(Map seats, int choiceSeat, int menberNum){
        if(menberNum > seats.size()){
            return false;    
        }
        
        boolean flag = true;
        
        for(int i = 0,index = 1; i < menberNum; i++){
        	
            //index:Geben Sie die allererste 1 der Sitzinformationen an
            //Wird beim Zählen von 1 verwendet, wenn die Anzahl der Kunden die Sitzplatznummer überschreitet
        	
            if(seats.size() < choiceSeat + i){
                if(seats.get(index).equals(false)){
                    flag = false;
                    index++;
                } else {
                    index++;
                }
            } else if(seats.get(choiceSeat + i).equals(false)){
                flag = false;
            }
                
            }
        if(flag){
            return true;
        } else {
            return false;
        }
    }
}

Ergebnis

スクリーンショット 2018-10-27 22.16.26.png

Kommentar

Zuerst habe ich grob ein Flussdiagramm geschrieben スクリーンショット 2018-10-27 23.01.49.png

Dies ist eine grobe Idee, aber Sie wissen, welche Art von Code Sie schreiben müssen.

Der schwierige Teil dieses Problems besteht darin, dass die Sitze kreisförmig sind. Es gibt 10 Sitzplätze und eine Gruppe von 4 Kunden möchte vom 8. Sitzplatz aus sitzen! !! Wenn das der Fall ist 8、9、10、1 Es ist notwendig, über die Sitznummer hinweg zu verarbeiten.

Nachdem Sie eine Stunde lang darüber nachgedacht haben, warum nicht einen Zähler getrennt von dem Zähler herstellen, für den ich mich entschieden habe? Deshalb habe ich diesen Teil ausprobiert

for(int j = 0,index = 1 ; j < memberNum; j++){
        if(seats.size() < choiceSeat + j){
            seats.put(index, false);
            index++;
        } else {
            seats.put(choiceSeat + j,false);
        }
}

Ich frage mich auch, ob es einen besseren Weg gibt.

Überprüfen Sie Ihren Code selbst

Erstens ist die Verschachtelung des Teils, der in die Sitzinformationen falsch schreibt, zu tief. Ich kann nicht daran denken, aber ich denke, ich kann es präziser schreiben.

Auch der Teil, der den Sitz überspannt, ist viele Male der gleiche Vorgang Ich denke, es sollte eine Methode sein, aber Nachdem ich das Problem einmal gelöst habe, funktioniert mein Gehirn nicht ww

Beiseite

Das erste was ich dachte

Japanisch ist schwierig ... Ich kann so etwas machen, aber es funktioniert einen Tag lang nicht ... Ich habe es geschafft, es zum Laufen zu bringen, aber ich habe einen Tag gebraucht, um das Problem richtig zu erkennen. Am letzten Tag habe ich etwas geschrieben, das funktioniert hat.
Was Sie am zweiten Tag gemacht haben, hat die Anforderungen nicht ganz erfüllt. Ich habe 26 Sitze gemacht ... Wenn Sie nicht richtig erkennen, was die andere Person will, werden Sie die Hölle sehen, dies neu zu erstellen.
Auch nach dem berühmten Buch "Readable Code" Lehrer, "Schreiben Sie einen Code, den Sie sofort verstehen können, anstatt einen Kommentar zu schreiben." Aber diesmal können auch diejenigen, die nicht mit Java vertraut sind, verstehen Ich schreibe einen einfachen Kommentar.

Meinungen, Eindrücke, Verbesserungen, meine schlechten Worte, suchen

Dies war mein erster Beitrag, aber diesmal ist es vorbei. Wenn es ein implizites Verständnis von Qiita gibt, ignoriere ich wahrscheinlich alle Waffen, aber Ich wäre dankbar, wenn jeder, der es liest, eine Aufzeichnung hinterlassen könnte.

Für diejenigen, die bis zum Ende lesen Vielen Dank.

Nachtrag

In Bezug auf die Übungen kontaktierte mich Paiza, die ich posten kann.

スクリーンショット 2018-10-29 22.17.03.png

Referenz

Paiza

Objektorientierte Ausgabe

Ich habe versucht, es mit Java zu lösen! !! Paiza-Übung "Long Table Unagiya" ~ Objektorientiert ~

Recommended Posts

Ich habe es mit Java gelöst! !! Paiza-Übung "Long Table Unagiya"
Ich habe es mit Java gelöst! !! Paiza-Übung "Long Table Unagiya" ~ Objektorientiert ~
[Netabare] Aalladen mit langem Tisch (entspricht Paiza Rang B)
Parkett-Tools gibt java.lang.ExceptionInInitializerError, also habe ich es mit java8 funktionieren lassen
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Was ich mit Java Gold gelernt habe
Was ich mit Java Silver gelernt habe
Ich habe eine Lambda-Funktion in Java geschrieben und mit SAM bereitgestellt