일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 인프콘
- 상속
- 백준 1712
- 자바의 정석
- l3 스위치
- modifiers
- 데이터 송수신
- 테슬라폰
- aws 자격증
- TCP/IP
- 10866
- 역캡슐화
- 개발바닥
- 파이썬
- 인터페이스
- 남궁성
- 백준 2775
- 네트워크
- 1764
- java
- 유선LAN
- 자바
- 다형성
- 논리구성도
- 계층화
- 물리구성도
- 파이썬 1712
- network
- 프로토콜
- AWS CLF
- Today
- Total
병훈's Blog
SWEA - 1209. [S/W 문제해결 기본] 2일차 - Sum (Python, Java) 본문
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV13_BWKACUCFAYh
다음 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 형태로 만들고, 필요할 때 호출하는 방식이 객체지향적이다
'Algorithm' 카테고리의 다른 글
SWEA - 2071. 평균값 구하기 (Python, Java, C++) (0) | 2022.12.30 |
---|---|
SWEA - 2068. 최대수 구하기 (Python, Java, C++) (0) | 2022.12.30 |
SWEA - 2063. 중간값 찾기 (Python, Java, C++) (0) | 2022.12.30 |
SWEA - 2058. 자릿수 더하기 (Python, Java, C++) (1) | 2022.12.30 |
SWEA - 1936. 1대1 가위바위보 (Python, Java, C++) (0) | 2022.12.30 |