병훈's Blog

SWEA - 1209. [S/W 문제해결 기본] 2일차 - Sum (Python, Java) 본문

Algorithm

SWEA - 1209. [S/W 문제해결 기본] 2일차 - Sum (Python, Java)

thdqudgns 2023. 1. 1. 23:56

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV13_BWKACUCFAYh 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

다음 100X100의 2차원 배열이 주어질 때, 각 행의 합, 각 열의 합, 각 대각선의 합 중 최댓값을 구하는 프로그램을 작성하여라.

다음과 같은 5X5 배열에서 최댓값은 29이다.


[제약 사항]

총 10개의 테스트 케이스가 주어진다.

배열의 크기는 100X100으로 동일하다.

각 행의 합은 integer 범위를 넘어가지 않는다.

동일한 최댓값이 있을 경우, 하나의 값만 출력한다.
 
[입력]

각 테스트 케이스의 첫 줄에는 테스트 케이스 번호가 주어지고 그 다음 줄부터는 2차원 배열의 각 행 값이 주어진다.

[출력]

#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 답을 출력한다.

 


JAVA가 메모리가 1/2네요...덜덜

 

<Python>

# 테스트케이스 10 고정, 100x100 배열 고정
for _ in range(10):
    t = int(input())
    arr = [list(map(int, input().split())) for _ in range(100)]
    maxA = 0
    maxB = 0
    maxC = 0
      
    # 행, 열, 대각선의 합
    for i in range(100):
        sumA, sumB, sumC = 0, 0, 0
        for j in range(100):
            sumA += arr[i][j]
            sumB += arr[j][i]
            if i == 0:
                sumC += arr[j][j]
        if sumA > maxA: maxA = sumA
        if sumB > maxB: maxB = sumB
        if sumC > maxC: maxC = sumC
      
    # 비교
    result = max(maxA, maxB, maxC)
      
    print(f'#{t} {result}')

 

가장 먼저 배열에 입력된 값을 저장하고

그 후에 i, j로 2중 for 문을 돌 때, 행은 A, 열은 B, 대각선은 C로 하여

각각 더하고, 더한값이 최댓값보다 크면 최신화 하고,

마지막에 그 셋 중 가장 큰값을 또 저장한다.

 

파이썬은 내가 생각하는 논리 흐름대로 작성을 할 때

간편하다는 게 최대 장점이다.

 


 

<JAVA>

import java.util.*;
import java.io.*;
 
class Solution
{
    public static void main(String args[]) throws IOException
    {
        //이게 반복문 안에 들어가니 문제가 생겼다.
        //stack overflow가 발생함..ㄷㄷ
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         
        for(int T = 0; T < 10; T++) {
            int t = Integer.parseInt(br.readLine());
             
            int[][] arr = new int[100][100];
             
            for(int i = 0; i<100; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                for (int j = 0; j<100; j++) {
                    arr[i][j] = Integer.parseInt(st.nextToken());
                }
            }
             
            int max = 0;
             
            for (int i = 0; i<100; i++) {
                int sumA = 0;
                int sumB = 0;
                int sumC = 0;
                sumC += arr[i][i];
                for (int j = 0; j<100; j++) {
                    sumA += arr[i][j];
                    sumB += arr[j][i];
                }
                if (sumA > max) max = sumA;
                if (sumB > max) max = sumB;
                if (sumC > max) max = sumC;
            }
             
             
            System.out.printf("#%d %d\n", t, max);
             
        }// test_case
         
    }//main
     
}//Solution

 

파이썬과 똑같은 방식으로 풀었다.

기존에는 Scanner 클래스를 사용하다가, 이번에는 BufferedReader와 StringTokenizer를 사용했다.

이것이 버퍼에 데이터를 모은 후에, 한 번에 데이터를 이동시키기에

데이터의 입력마다 데이터를 넘기는 Scanner보다 빠르다고 한다.

 

Java의 문법으로 파악해야 할 것은 다음과 같다.

 

  • BufferedReader와 StringTokenizer 클래스를 이용한 입력방법의 변화
  • 기본 String으로 입력받은 데이터를 Integer.parseInt()를 사용하여 정수 데이터로 형변환
  • 2차원 배열의 생성은 int[][] arr = new int[][]; 형태로 생성하고, 반복문으로 값 저장
  • StringTokenizer(br.readLine())은 한 줄씩 읽어오기에, 행마다 반복하기 위해 i가 바뀔 때마다 넣어줌
  • if문을 3번 사용하면서 3개의 값 중 최댓값 저장
  • System.out.printf()로, 출력 형식을 지정하여 출력함.
  • 다른 분들은 StringBuilder 타입의 변수에 append로 값을 추가하는 형식으로 저장했다가 출력함
  • 필요한 작업들을 method 형태로 만들고, 필요할 때 호출하는 방식이 객체지향적이다

 

 

 

 

728x90
728x90