87 lines
2.0 KiB
Java
87 lines
2.0 KiB
Java
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<Integer> column1 = new ArrayList<>(1000);
|
|
ArrayList<Integer> 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<Integer> 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.
|
|
*/
|