See More

import java.util.ArrayList; import java.util.Arrays; public class Solution4 extends Solution { public Solution4() { super(4); } public static void main(String[] args) { Solution solution = new Solution4(); solution.testPartTwo(); } @Override String solvePartOne(String inputData) { ArrayList in = new ArrayList<>(Arrays.asList(inputData.split("\n"))); int rows = in.size(); int cols = in.get(0).length(); char[][] matrix = new char[rows][cols]; for (int i = 0; i < rows; i++) { matrix[i] = in.get(i).toCharArray(); } int sum = 0; char rollChar = '@'; for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { char current = matrix[r][c]; if (current == rollChar) { int rollCount = 0; rollCount += (r - 1 >= 0 && c - 1 >= 0 && matrix[r - 1][c - 1] == rollChar) ? 1 : 0; rollCount += (r - 1 >= 0 && matrix[r - 1][c] == rollChar) ? 1 : 0; rollCount += (r - 1 >= 0 && c + 1 < cols && matrix[r - 1][c + 1] == rollChar) ? 1 : 0; rollCount += (c - 1 >= 0 && matrix[r][c - 1] == rollChar) ? 1 : 0; rollCount += (c + 1 < cols && matrix[r][c + 1] == rollChar) ? 1 : 0; rollCount += (r + 1 < rows && c - 1 >= 0 && matrix[r + 1][c - 1] == rollChar) ? 1 : 0; rollCount += (r + 1 < rows && matrix[r + 1][c] == rollChar) ? 1 : 0; rollCount += (r + 1 < rows && c + 1 < cols && matrix[r + 1][c + 1] == rollChar) ? 1 : 0; if (rollCount < 4) { sum += 1; } } } } return String.valueOf(sum); } @Override String solvePartTwo(String inputData) { ArrayList in = new ArrayList<>(Arrays.asList(inputData.split("\n"))); int rows = in.size(); int cols = in.get(0).length(); char[][] matrix = new char[rows][cols]; for (int i = 0; i < rows; i++) { matrix[i] = in.get(i).toCharArray(); } int sum = 0, removals; char rollChar = '@'; char[][] matrixCopy = new char[rows][cols]; for (int i = 0; i < rows; i++) { matrixCopy[i] = Arrays.copyOf(matrix[i], cols); } do { removals = 0; for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { char current = matrix[r][c]; if (current == rollChar) { int rollCount = 0; rollCount += (r - 1 >= 0 && c - 1 >= 0 && matrix[r - 1][c - 1] == rollChar) ? 1 : 0; rollCount += (r - 1 >= 0 && matrix[r - 1][c] == rollChar) ? 1 : 0; rollCount += (r - 1 >= 0 && c + 1 < cols && matrix[r - 1][c + 1] == rollChar) ? 1 : 0; rollCount += (c - 1 >= 0 && matrix[r][c - 1] == rollChar) ? 1 : 0; rollCount += (c + 1 < cols && matrix[r][c + 1] == rollChar) ? 1 : 0; rollCount += (r + 1 < rows && c - 1 >= 0 && matrix[r + 1][c - 1] == rollChar) ? 1 : 0; rollCount += (r + 1 < rows && matrix[r + 1][c] == rollChar) ? 1 : 0; rollCount += (r + 1 < rows && c + 1 < cols && matrix[r + 1][c + 1] == rollChar) ? 1 : 0; if (rollCount < 4) { matrixCopy[r][c] = 'x'; removals += 1; sum += 1; } } } } // System.out.printf("Remove %d rolls of paper: \n", removals); // for (int i = 0; i < rows; i++) { // System.out.println(new String(matrixCopy[i])); // for (int j = 0; j < cols; j++) { // if (matrixCopy[i][j] == 'x') { // matrixCopy[i][j] = '.'; // } // } // } // System.out.println(); for (int i = 0; i < rows; i++) { matrix[i] = Arrays.copyOf(matrixCopy[i], cols); } } while (removals > 0); return String.valueOf(sum); } }