https://www.acmicpc.net/problem/2460
2460번: 지능형 기차 2
최근에 개발된 지능형 기차가 1번역(출발역)부터 10번역(종착역)까지 10개의 정차역이 있는 노선에서 운행되고 있다. 이 기차에는 타거나 내리는 사람 수를 자동으로 인식할 수 있는 장치가 있다.
www.acmicpc.net
Answer
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
final int STATION_MAX = 10;
int maxCount = 0;
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
StringTokenizer st = null;
int totalCount = 0;
int outCount = 0;
int inCount = 0;
for (int i = 0; i < STATION_MAX; i++) {
st = new StringTokenizer(br.readLine(), " ");
outCount = Integer.parseInt(st.nextToken());
inCount = Integer.parseInt(st.nextToken());
totalCount += inCount - outCount;
if (maxCount < totalCount) {
maxCount = totalCount;
}
}
} catch (IOException e) {
System.err.println("ERROR = " + e.getMessage());
}
System.out.println(maxCount);
}
}
Code Review
final int STATION_MAX = 10;
int maxCount = 0;
지문에서 10개의 역이 있다고 해서 `STATION_MAX`를 `final`로 선언했다.
각 역에서 기차에 사람이 가장 많을 때를 구하기 위해 `maxCount` 변수를 선언했다.
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
...
} catch (IOException e) {
System.err.println("ERROR = " + e.getMessage());
}
`try-with-resources`로 try에 객체의 자원을 받아서 try문이 끝나면 그 자원을 자동으로 반환한다.
`System.in`으로 사용자로부터 입력받은 데이터를 바이트 기반 스트림으로 받는다.
`InputStreamReader` 클래스로 바이트 스트림을 문자 기반 스트림으로 변환한다.
`BufferedReader` 클래스로 문자 스트림을 읽는다.
이제 try문 안의 로직을 살펴보자.
StringTokenizer st = null;
int totalCount = 0;
int outCount = 0;
int inCount = 0;
입력받은 문자열을 나누기 위해 `StringTokenizer` 객체를 사용한다.
각 역에서 기차에 남아 있는 사람수를 계산하기 위해 `totalCount`를 선언한다.
내린 사람수와 탄 사람수를 계산하기 위해 각각 `outCount`, `inCount`를 선언한다.
이어서 try문 안의 로직이다.
for (int i = 0; i < STATION_MAX; i++) {
st = new StringTokenizer(br.readLine(), " ");
outCount = Integer.parseInt(st.nextToken());
inCount = Integer.parseInt(st.nextToken());
totalCount += inCount - outCount;
if (maxCount < totalCount) {
maxCount = totalCount;
}
}
for문으로 역의 수만큼 로직을 반복한다.
입력받은 문자열 한 행을 공백 구분자로 나눈 `StringTokenizer` 객체를 생성한다. 이때 for문 밖에서 초기화했던 객체를 재사용한다.
`StringTokenizer`로 나뉜 문자열 `st.nextToken()`을 `Integer.parseInt()` 정수형으로 변환하여 각각 `outCount`, `inCount`에 대입한다.
내린 사람 수와 탄 사람 수를 가져왔으면 `totalCount`에 탄 사람 수를 더하고 내린 사람 수를 뺀다.
`totalCount += inCount - outCount`는 `totalCount = totalCount + inCount - outCount`와 같다.
`maxCount`가 현재 역에서 기차에 있는 사람 수보다 작으면 `totalCount`를 대입한다.
위 로직을 반복하면 `maxCount`로 기차에 사람이 가장 많을 때의 사람 수를 확인할 수 있다.