SWEA - 1209. [S/W 문제해결 기본] 2일차 - Sum (Python, Java)
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차원 배열의 각 행 값이 주어진다.
[출력]
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 테스트 케이스의 답을 출력한다.
<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 형태로 만들고, 필요할 때 호출하는 방식이 객체지향적이다