

1. 문제 풀이 아이디어
- 엘리베이터는 항상 1층으로 이동하므로 출차 순서와 관계없이 계산이 가능하다.
- 또한 각 층의 컨테이너 벨트 이동 시간을 따로 계산하여 문제를 해결할 수 있다.
2. 나의 정답 코드
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
StringBuilder stringBuilder = new StringBuilder();
int t = Integer.parseInt(bufferedReader.readLine());
for (int i = 0; i < t; i++) {
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int h = Integer.parseInt(stringTokenizer.nextToken());
int l = Integer.parseInt(stringTokenizer.nextToken());
int result = 0;
for (int j = 0; j < h; j++) {
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
Map<Integer, Integer> map = new TreeMap<>();
for (int k = 0; k < l; k++) {
int a = Integer.parseInt(stringTokenizer.nextToken());
if (a == -1)
continue;
result += 20 * j;
map.put(a, k);
}
int prev = 0;
for (int a : map.values()) {
result += 5 * Math.min(Math.abs(a - prev), l - Math.abs(a - prev));
prev = a;
}
}
stringBuilder.append(result).append('\n');
}
System.out.print(stringBuilder);
bufferedReader.close();
}
}
3. 정리
- 입력값을 처리할 때 차량이 있는 경우
20 * j
를 더해 엘리베이터 이동시간을 계산하고, 트리맵에 출차 순서와 차량 위치를 저장한다.
- 층의 입력을 모두 처리한 후, 출차 순서에 따라 이전 위치와 현재 위치를 계산하여 이동시간을 결과값에 추가한다.
- 모든 층의 계산이 끝나면 최종 결과값을 출력하여 문제를 해결한다.
Share article