728x90
1. 문제
https://www.acmicpc.net/problem/2564
1. 어떤 경계에 있는지, 경계의 어느 위치에 있는지를 입력 받음
2. 북쪽, 남쪽은 왼쪽에서부터, 동쪽, 서쪽은 위에서부터 떨어진 거리를 입력 받음(문제 풀 때 중요)
3. 마지막에 주어지는 동근이의 위치와 나머지 상점들 간의 최단거리를 구해야 함
2. 풀이
북쪽 맨 왼쪽을 0으로 삼고 그 나머지를 거기에 맞춰 다시 좌표를 만들면 되는 문제였다.
북쪽 0,0을 기준으로 직선으로 만드는 법
1. 북쪽은 입력받은 좌표를 그대로 넣는다.
2. 동쪽은 북쪽 너비+좌표를 넣는다.
3. 남쪽은 북쪽 너비+동쪽 높이+(남쪽 너비-좌표)를 넣는다. 시계방향이기 때문에 가로길이에서 좌표를 빼준다.
4. 서쪽은 북쪽 너비+동쪽 높이+남쪽 너비+(서쪽 높이-좌표)를 넣는다. 이유는 3과 동일하다.
동근이 위치는 따로 변수를 선언하지 않고 상점을 넣었던 배열 마지막에 같이 넣어주었다.
상점들 위치와 동근이 위치를 비교할 때,
어떤 좌표가 더 큰 지 모르기 때문에 절댓값으로 계산한다.
이렇게 계산한 길이와 좌표의 총 길이(너비*2+높이*2)에서 그 길이를 빼준 값 둘 중에 더 작은 값을 합계에 넣는다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class BOJ_2564_경비원 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
int width = Integer.parseInt(st.nextToken());
int height = Integer.parseInt(st.nextToken());
int total = (width + height) << 1;
int N = Integer.parseInt(in.readLine());
//마지막 방은 동근이 위치
int[] spots = new int[N + 1];
for (int i = 0; i <= N; i++) {
st = new StringTokenizer(in.readLine());
int way = Integer.parseInt(st.nextToken());
spots[i] = Integer.parseInt(st.nextToken());
if (way == 2) spots[i] = width - spots[i];
else if (way == 3) spots[i] = height - spots[i];
switch (way) {
case 3: spots[i] += width;
case 2: spots[i] += height;
case 4: spots[i] += width;
}
}
//상점-동근위치 빼고, 그 길이와 토탈-길이 비교하기
int sum = 0;
for (int i = 0; i < N; i++) {
int len = Math.abs(spots[N] - spots[i]);
sum += Math.min(len, total - len);
}
System.out.println(sum);
}
}
3. 결과
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 16926 배열돌리기1 - JAVA (0) | 2022.02.12 |
---|---|
[BOJ] 2563 색종이 - JAVA (0) | 2022.02.11 |
[BOJ] 2578 빙고 - JAVA (0) | 2022.02.11 |
[BOJ] 3053 택시기하학 - JAVA (0) | 2022.02.10 |
[BOJ] 2605 줄세우기 - JAVA (0) | 2022.02.09 |
댓글