1. 문제 링크
2096번: 내려가기
첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.
www.acmicpc.net
2. 문제 및 입출력예제
3. 문제 풀이
최솟값과 최댓값을 저장하는 배열을 따로 만들었고 처음 입력받은 줄을 배열에 저장한 상태에서 시작한다.
계속해서 입력받으면서 비교 범위에 있는 값들 중 큰 값과 입력받은 값을 더해 저장한다.
전부 입력 받은 후에 저장된 값들 중 최솟값과 최댓값을 찾는다.
주의할 점은 비교할 때 이후에 입력받은 값들 중 크거나 작은 값이 아니라,
이미 저장된 값들 중 크거나 작은 값을 찾아 더하는 방식으로 진행해야 한다.
비교하는 값을 어디로 잡느냐에 따라서 문제를 맞고 틀리고가 정해진다.
4. 코드
import java.io.BufferedReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in));
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
int N = Integer.parseInt(br.readLine());
int[] line = new int[3];
int[] maxA = new int[3];
int[] minA = new int[3];
int[] now = new int[3];
String[] split = new String[3];
for(int i=0;i<N;i++) {
split = br.readLine().split(" ");
for(int j=0;j<3;j++) {
line[j] = Integer.parseInt(split[j]);
}
if(i==0) {
maxA[0] = line[0];
maxA[1] = line[1];
maxA[2] = line[2];
minA[0] = line[0];
minA[1] = line[1];
minA[2] = line[2];
}
else {
now[0] = line[0] + Math.max(maxA[0], maxA[1]);
now[1] = line[1] + Math.max(maxA[0], Math.max(maxA[1], maxA[2]));
now[2] = line[2] + Math.max(maxA[1], maxA[2]);
maxA[0] = now[0];
maxA[1] = now[1];
maxA[2] = now[2];
now[0] = line[0] + Math.min(minA[0], minA[1]);
now[1] = line[1] + Math.min(minA[0], Math.min(minA[1], minA[2]));
now[2] = line[2] + Math.min(minA[1], minA[2]);
minA[0] = now[0];
minA[1] = now[1];
minA[2] = now[2];
}
}
max = Math.max(maxA[0], Math.max(maxA[1], maxA[2]));
min = Math.min(minA[0], Math.min(minA[1], minA[2]));
System.out.println(max+" "+min);
}
}
'ALGORITHM' 카테고리의 다른 글
백준 21608 상어 초등학교 (Java) (0) | 2023.03.11 |
---|---|
백준 11052 카드 구매하기 (Java) (0) | 2023.03.10 |
백준 11057 오르막 수 (Java) (0) | 2023.03.09 |
백준 10431 줄세우기 (Java) (0) | 2023.03.08 |
백준 11866 요세푸스 문제 0 (Java) (0) | 2023.03.07 |