인프런 커뮤니티 질문&답변

jay님의 프로필 이미지
jay

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

9. 격자판 최대합

2중 for문 한번으로 하려고 고민했습니다.

작성

·

252

·

수정됨

0


public class 격자판_최대합 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int[][] panel = new int[n][n];

        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                panel[i][j] = sc.nextInt();

        DiagonalCalculator diagonal = new DiagonalCalculator();
        RowColumnCalculator row = new RowColumnCalculator();
        RowColumnCalculator column = new RowColumnCalculator();
        for (int rowIndex = 0; rowIndex < n; rowIndex++) {

            for (int colIndex = 0; colIndex < n; colIndex++) {
                int rowNum = panel[rowIndex][colIndex];
                int colNum = panel[colIndex][rowIndex];

                diagonal.calc(rowIndex, colIndex, rowNum, n);
                row.tempSum(rowNum);
                column.tempSum(colNum);
            }
            row.calcMaxSum();
            column.calcMaxSum();
        }

        int diagonalSum = diagonal.getMaxSum();
        int rowSum = row.getMaxSum();
        int colSum = column.getMaxSum();

        int maxValue = Math.max(diagonalSum, Math.max(rowSum, colSum));
        System.out.println(maxValue);
    }

    private static class DiagonalCalculator {
        private int leftSum = 0;
        private int rightSum = 0;

        public void calc(int rowIndex, int colIndex, int num, int length) {
            boolean sameLoc = rowIndex == colIndex;
            if (sameLoc)
                leftSum += num;

            if ((rowIndex + colIndex) == length)
                rightSum += num;
        }

        public int getMaxSum() {
            return Math.max(leftSum, rightSum);
        }
    }

    private static class RowColumnCalculator {
        private int totalSum = 0;
        private int tempSum = 0;

        public void tempSum(int num) {
            tempSum += num;
        }

        public void calcMaxSum() {
            if (totalSum < tempSum) {
                totalSum = tempSum;
            }
            tempSum = 0;
        }

        public int getMaxSum() {
            return totalSum;
        }
    }
}

클래스를 분리해서 계산하도록 하니 메인 로직에서는 필요한 값을 넘겨주기만 해도 되고, 나중에 결과를 받아올 때에도 메서드만 호출하면 되서 편했는데 전체적으로 코드가 좀 복잡해지지는 않는지, 이런 부분이 궁금합니다!

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
jay님, 주신 코드를 살펴보았을 때 클래스를 분리하여 계산하는 방식은 코드의 가독성과 재사용성을 높히는 좋은 접근방식입니다. 각각의 계산 로직을 별도의 클래스로 구현하여 책임을 분리함으로써 메인 로직의 복잡도를 낮추고, 나중에 비슷한 계산이 필요할 때 재사용할 수 있는 장점이 있습니다. 또한, 유지보수 및 디버깅 시에도 특정 기능을 담당하는 클래스만을 확인하면 되므로 효율적입니다.

하지만 코드의 복잡성에 대한 걱정도 이해가 됩니다. 클래스와 메서드 분리는 코드의 모듈성을 높이지만, 프로젝트의 규모나 팀의 선호도에 따라 적절한 수준에서 균형을 맞추는 것이 중요합니다. 즉, 각 기능의 분리가 과도하게 이루어지지 않도록 주의하는 것이 좋으멀로, 항상 코드의 단순성과 재사용성 사이에서 최적의 지점을 찾으려고 노력해야 합니다.

결론적으로, 귀하의 접근 방식은 매우 합리적이며, 코드 유지 보수성과 확장성 측면에서 긍정적인 영향을 줄 수 있습니다. 다만, 프로젝트의 전체 구조와 팀 내에서 선호하는 코딩 스타일, 그리고 유지 관리의 편의성을 고려하여 적용하는 것이 좋습니다.

jay님의 프로필 이미지
jay

작성한 질문수

질문하기