faecher:informatik:oberstufe:java:aoc:aoc2024:day01:start

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Nächste Überarbeitung
Vorherige Überarbeitung
faecher:informatik:oberstufe:java:aoc:aoc2024:day01:start [01.12.2024 09:38] – angelegt Marco Kuemmelfaecher:informatik:oberstufe:java:aoc:aoc2024:day01:start [04.01.2025 14:35] (aktuell) – [Teil 1] Marco Kuemmel
Zeile 10: Zeile 10:
   * ''ArrayList<Integer> varName = new ArrayList();'' Eine ArrayList eignet sich am besten, um eine **variable** Anzahl von Elementen zu speichern. Dies trifft generell immer auf **alle** AoC-Aufgaben zu (Arrays werden eher selten benötigt). Denke daran, dass du dazu auch ganz oben ''import java.util.ArrayList;'' aufrufen musst.   * ''ArrayList<Integer> varName = new ArrayList();'' Eine ArrayList eignet sich am besten, um eine **variable** Anzahl von Elementen zu speichern. Dies trifft generell immer auf **alle** AoC-Aufgaben zu (Arrays werden eher selten benötigt). Denke daran, dass du dazu auch ganz oben ''import java.util.ArrayList;'' aufrufen musst.
   * Mit folgender //for-each// Schleife kannst du am einfachsten über jede Zeile der Eingabedatei iterieren: ''for (String line: inputLines) {...}''   * Mit folgender //for-each// Schleife kannst du am einfachsten über jede Zeile der Eingabedatei iterieren: ''for (String line: inputLines) {...}''
-  * Mit ''line.split("...")'' bekommst du ein Array von Strings zurückgeliefert, dass den ursprünglichen String ''line'' an denjenigen Stellen aufgeteilt hat, die im Anführungszeichen stehen. Das String-Element, an dem geteilt wird, verschwindet dabei! Nutze das, um jede Zeile in die linke und rechte Zahl zu splitten. An was für einem String-Element musst du die Trennung durchführen?+  * Mit ''line.split("...")'' bekommst du ein Array von Strings zurückgeliefert, das den ursprünglichen String ''line'' an denjenigen Stellen aufgeteilt hat, die im Anführungszeichen stehen. Das String-Element, an dem geteilt wird, verschwindet dabei! Nutze das, um jede Zeile in die linke und rechte Zahl zu splitten. An was für einem String-Element musst du die Trennung durchführen?
   * Mit ''Integer.parseInt(...)'' kannst du einen String in einen Integer umwandeln. Damit kannst du pro Schleifendurchlauf folgenden Code verwenden, um an die **linke** Zahl zu gelangen: ''Integer.parseInt(line.split("...")[0])'' (für die rechte Zahl musst du nur eine Kleinigkeit ändern).   * Mit ''Integer.parseInt(...)'' kannst du einen String in einen Integer umwandeln. Damit kannst du pro Schleifendurchlauf folgenden Code verwenden, um an die **linke** Zahl zu gelangen: ''Integer.parseInt(line.split("...")[0])'' (für die rechte Zahl musst du nur eine Kleinigkeit ändern).
   * Mit ''liste.add(...)'' kannst du ein Element zu einer ArrayList namens ''liste'' hinzufügen.   * Mit ''liste.add(...)'' kannst du ein Element zu einer ArrayList namens ''liste'' hinzufügen.
Zeile 18: Zeile 18:
 ++++ Vorgehensweise | ++++ Vorgehensweise |
   * Initialisiere zwei ArrayLists für Integerzahlen - je eine für die linken und eine für die rechten Zahlen.   * Initialisiere zwei ArrayLists für Integerzahlen - je eine für die linken und eine für die rechten Zahlen.
-  * Iteriere über jede Schleife und füge dabei die linke und rechte Zahl in die jeweile ArrayList hinzu.+  * Iteriere über jede Zeile und füge dabei die linke und rechte Zahl in die jeweile ArrayList hinzu.
   * Sortiere beide Arrays.   * Sortiere beide Arrays.
-  * Merke dir nun die akkumulierenden Differenzen (beginnend mit 0).+  * Merke dir nun die akkumulierenden ("aufaddierenden"Differenzen (beginnend mit 0).
   * Iteriere über jedes Listenelement: Addiere zur Lösung (den Differenzen) den **Betrag** (''Math.abs(...)'') der Differenz der linken und der rechten Zahl.   * Iteriere über jedes Listenelement: Addiere zur Lösung (den Differenzen) den **Betrag** (''Math.abs(...)'') der Differenz der linken und der rechten Zahl.
   * Nach dem Schleifendurchlauf kannst du die Differenzen ausgeben/zurückgeben.   * Nach dem Schleifendurchlauf kannst du die Differenzen ausgeben/zurückgeben.
Zeile 48: Zeile 48:
     // Ich habe die Methode zu einer void-Methode umgewandelt, anstatt einen int-Rückgabewert zu verlangen.     // Ich habe die Methode zu einer void-Methode umgewandelt, anstatt einen int-Rückgabewert zu verlangen.
     // Die Lösung kann man so einfacher aus der Konsole kopieren.     // Die Lösung kann man so einfacher aus der Konsole kopieren.
 +}
 +</code>
 +++++
 +
 +===== Teil 2 =====
 +
 +++++ Vorgehensweise |
 +  * Die ersten Schritte bis inklusive dem zeilenweisen Einlesen alles Zahlen in zwei ArrayLists ist identisch! Anschließend muss die Berechnung aber anders ablaufen.
 +  * Die Zahlen müssen nun **nicht** sortiert werden.
 +  * Iteriere in einer Schleife über alle linken Zahlen. Pro linker Zahl iterierst du in einer weiteren Schleife über **alle** rechten Zahlen und vergleichst, ob die link Zahl mit einer der rechten Zahlen übereinstimmt. **Wichtig:** Du musst hier zum Vergleichen mit ''equals(...)'' arbeiten - also: ''linkeZahl.equals(rechteZahl)''. Zähle die Anzahl der Übereinstimmungen. Anschließend addierst du das Produkt der Übereinstimmungen und der linken Zahl zum Ergebnis.
 +++++
 +
 +++++ Lösungsvorschlag |
 +<code java>
 +public void partTwo() {
 +    ArrayList<Integer> left = new ArrayList<>();
 +    ArrayList<Integer> right = new ArrayList<>();
 +
 +    for (String line: inputLines) {
 +        left.add(Integer.parseInt(line.split("   ")[0]));
 +        right.add(Integer.parseInt(line.split("   ")[1]));
 +    }
 +
 +    int similarityScore = 0;
 +
 +    for (int l = 0; l < left.size(); l++) {
 +        int times = 0;
 +        for (int r = 0; r < right.size(); r++) {
 +            if (right.get(r).equals(left.get(l))) {
 +                times++;
 +            }
 +        }
 +
 +        similarityScore += times * left.get(l);
 +    }
 +
 +    System.out.println(similarityScore);
 } }
 </code> </code>
 ++++ ++++
  • faecher/informatik/oberstufe/java/aoc/aoc2024/day01/start.1733045902.txt.gz
  • Zuletzt geändert: 01.12.2024 09:38
  • von Marco Kuemmel