Je l'ai résolu avec Java! !! Exercice de Paiza "Long Table Unagiya"

introduction

Cet article est écrit par des débutants en programmation. Quel est le problème, vous devriez le faire plus! !! Si vous avez des questions, Commentez s'il vous plaît.

Cette question est aussi un exercice de paiza. Soyez assuré qu'il n'y a rien à voir avec l'augmentation ou la diminution du rang.

problème

Maintenant, m groupes de personnes viennent à leur tour à leur place. Soit a_i le nombre de personnes dans le i-ème groupe (1 ≤ i ≤ m). Ils essaient de s'asseoir dans une série de a_i sièges d'affilée sur la longue table.

Cependant, comme le client est un enfant Edo, si l'un de ces sièges est déjà assis par le client précédent, Tout le groupe se met en colère et rentre chez lui sans s'asseoir. Le gamin Edo est rapide.

Dans l'entrée, la position des sièges consécutifs où le i-ème groupe va siéger est spécifiée par l'entier b_i. Le i-ème groupe part du siège avec le numéro de siège b_i et essaie de s'asseoir sur a_i sièges dans le sens des aiguilles d'une montre à partir de là.

Créez un programme qui indique le nombre de personnes qui sont assises en toute sécurité dans la longue table après que le dernier groupe est venu s'asseoir.

Valeur à saisir

L'entrée se compose de m + 1 lignes. Sur la première ligne, n (nombre de sièges) et m (nombre de groupes) sont entrés séparés par des espaces demi-largeur. Dans la ligne i + 1 (1 ≤ i ≤ m), deux entiers a_i (nombre de personnes dans le groupe) et b_i (numéro de siège de départ) sont entrés séparés par un espace demi-largeur.

Un saut de ligne est inséré à la fin de la dernière ligne de la valeur d'entrée. La chaîne est transmise à partir de l'entrée standard.

Exemple) 6 3 3 2 1 6 2 5

Production attendue

Une fois que le dernier groupe s'est assis, veuillez indiquer le nombre de personnes qui peuvent être assises en toute sécurité sur une ligne.

Exemple) 4

conditions

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

Code qui a obtenu 100 points

package paiza;
import java.util.*;

public class unagiya {

	public static void main(String[] args) {
		/*
		 *Obtenez le nombre total de sièges dans le magasin et le nombre de groupes visitant le magasin sous forme de chaîne et enregistrez-le dans la ligne
		 *Les données stockées en ligne sont divisées par division et stockées dans lineArray du tableau String.
         */
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        String[] lineArray = line.split(" ");
        /*
         *Cast les données stockées dans lineArray et les stocker dans chaque variable
         * 
         * seatNum:nombre de places
         * totalGuest:Nombre de groupes visitant le magasin
        */
        int seatNum = castString(lineArray[0]);
        int totalGuest = castString(lineArray[1]);
        
        /*
         * seats:Créer le nombre de sièges avec hashMap
         *Integer est le numéro de siège
         *Que Boolean soit une personne ou non(Si c'est vrai, vous pouvez vous asseoir,)
         */
        Map<Integer,Boolean> seats = new HashMap<>();
        for(int i = 1; i <= seatNum; i++){
            seats.put(i,true);
        }
        /*
         *isSitCustomer:Vérifiez s'il y a des personnes dans le siège choisi par le client
         *Sinon, lancez vrai
         *
         * choiceSeat:Numéro de siège qui est le point de base que les clients doivent choisir
         *menberNum:Nombre de clients venus
         */
        
        int choiceSeat = 0;
        int memberNum = 0;
        
        for(int i = 0; i < totalGuest; i++){
        	//Reçoit la valeur d'entrée de la console
        	//Attribuer à memberNum et choiceSeat
            line = scanner.nextLine();
            lineArray = line.split(" ");
            
            memberNum = castString(lineArray[0]);
            choiceSeat = castString(lineArray[1]);
            
            //Si isSitGuest est vrai, réécrivez les informations de siège du siège sélectionné par le client et le nombre de personnes sur false
            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);
                    }
                }
            }
        }
        
        //Vérifiez le faux nombre d'informations sur le siège et remplacez-le dans le résultat
        int result = 0;
        
        for(int i = 1; i <= seats.size(); i++){
            if(seats.get(i).equals(false)){
                result++;
            }
        }
        System.out.println(result);
    }

	//Convertir un nombre de type String en type int
    public static int castString(String strNum){
        int num = Integer.parseInt(strNum);
        return num;
    }
    
    /*
     *Plan Recevoir les informations sur les sièges, les sièges sélectionnés par les clients, le nombre de clients,
     *Vérifier s'il y a faux pour le nombre de clients du siège sélectionné par le client
     * 
     *conditions
     *Renvoie false s'il y a plus d'invités que de sièges
     *Renvoie false s'il y a même un faux dans les informations de siège
     */
    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:Spécifiez le tout premier 1 des informations sur le siège
            //Utilisé lors du comptage à partir de 1 lorsque le nombre de clients dépasse le numéro de siège
        	
            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;
        }
    }
}

résultat

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

Commentaire

D'abord, j'ai grossièrement écrit un organigramme スクリーンショット 2018-10-27 23.01.49.png

C'est une idée approximative, mais vous savez quel type de code écrire.

La partie difficile de ce problème est que les sièges sont circulaires. Il y a 10 sièges, et un groupe de 4 clients veut s'asseoir à partir de la 8e place! !! Si c'est le cas 8、9、10、1 Il est nécessaire de traiter le numéro de siège.

Après y avoir réfléchi pendant une heure, pourquoi ne pas faire un compteur séparément du compteur i for for? C'est pourquoi j'ai essayé cette partie

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);
        }
}

Je me demande également s'il existe une meilleure façon.

Vérifiez votre code vous-même

Premièrement, l'imbrication de la partie qui écrit faux dans les informations de siège est trop profonde. Je ne peux pas y penser, mais je pense que je peux l'écrire de manière plus concise.

En outre, la partie qui chevauche le siège est le même processus plusieurs fois, donc Je pense que ça devrait être une méthode, mais Après avoir résolu le problème une fois, mon cerveau ne fonctionne pas ww

De côté

La première chose que j'ai pensé

Le japonais est difficile ... Je peux faire quelque chose comme ça, mais ça ne marche pas pendant un jour ... J'ai réussi à le faire fonctionner, mais il m'a fallu une journée pour reconnaître correctement le problème. Le dernier jour, j'ai réussi à écrire quelque chose qui fonctionnait.
Ce que vous avez fait le deuxième jour ne répondait pas tout à fait aux exigences. J'ai fait 26 sièges ... Si vous ne reconnaissez pas correctement ce que l'autre personne veut, vous verrez l'enfer de recréer cela.
Aussi, selon le célèbre livre du professeur "Readable Code", "Écrivez un code que vous pouvez comprendre en un instant, plutôt que d'écrire un commentaire." Mais cette fois, même ceux qui ne sont pas familiers avec Java peuvent comprendre J'écris un simple commentaire.

Opinions, impressions, améliorations, mes mauvais mots, recherche

C'était mon premier message, mais cette fois c'est fini. S'il y a une compréhension implicite de Qiita, j'ignore probablement toutes les armes, mais Je serais reconnaissant à quiconque le lirait de laisser un enregistrement.

A ceux qui lisent jusqu'au bout Merci beaucoup.

Postscript

Concernant les exercices, paiza m'a contacté pour que je puisse poster.

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

référence

Paiza

Édition orientée objet

J'ai essayé de le résoudre avec Java! !! Exercice Paiza "Long Table Unagiya" ~ Orienté objet ~

Recommended Posts

Je l'ai résolu avec Java! !! Exercice de Paiza "Long Table Unagiya"
Je l'ai résolu avec Java! !! Exercice Paiza "Long Table Unagiya" ~ Orienté objet ~
[Netabare] Magasin d'anguilles de table longue (équivalent à la paiza rang B)
Parquet-tools donne java.lang.ExceptionInInitializerError, donc je l'ai fait fonctionner avec java8
J'ai essayé d'interagir avec Java
J'ai essayé la communication UDP avec Java
Ce que j'ai appris avec Java Gold
Ce que j'ai appris avec Java Silver
J'ai écrit une fonction Lambda en Java et l'ai déployée avec SAM