package com.mattrixwv.adventOfCode24.days; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; import com.mattrixwv.Stopwatch; public class Problem2 extends Problem{ private static final String inputFileName = "days/Problem1.txt"; public Problem2(){ super(); description = "Find the similarity score between the two columsn of numbers"; result = "Unresolved"; } @Override public String runSolution(){ Stopwatch timer = new Stopwatch(); timer.start(); int totalSimilarityScore = 0; ArrayList column1 = new ArrayList<>(1000); ArrayList column2 = new ArrayList<>(1000); //Read elements from the file into memory try(Scanner scanner = new Scanner(this.getClass().getClassLoader().getResourceAsStream(inputFileName))){ scanner.useDelimiter("\\s+"); while(scanner.hasNext()){ String token1 = scanner.next(); String token2 = scanner.next(); column1.add(Integer.parseInt(token1)); column2.add(Integer.parseInt(token2)); } } //Sort the two lists of ids Collections.sort(column1); Collections.sort(column2); //Get the similarity score of each elements and keep a running sum //The similarity score is the element in column 1 multiplied by the number of times it appears in column 2 for(Integer num : column1){ int count = count(num, column2); totalSimilarityScore += (num * count); } //Save the results timer.stop(); result = "The similarity score between the two columns of numbers is " + totalSimilarityScore + ".\nIt took " + timer.toString() + " to run the algorithm."; return result; } //Get the number of times a number appears in the list private int count(int num, List list){ int cnt = 0; for(Integer n : list){ if(n == num){ ++cnt; } if(n > num){ break; } } return cnt; } } /* Find the similarity score between the two columns of numbers The similarity score between the two columns of numbers is 24316233. It took 17.875 milliseconds to run the algorithm. */