단순하게 이 그림을 길게 펼치면 된다.
다음과 같이 마치 전개도 처럼 쭉 펼치면 x와 다른 상점들과의 거리를 계산하기 쉬워집니다.
이를 각 방향에 맞춰서 좌표를 입력받아 처리하면 문제는 쉽게 해결이 됩니다!
1. dir, idx에 따라 좌표를 1차원으로 봐꿔준다.
이런 식으로 1차원으로 표현이 완료됬다면 이제 최솟값을 구해주면 되는데 단순하게 두 점 사이에 거리를 구하는 식과 뒤로 넘어가서 구하는 식으로 구하면 된다.
Math.abs(상점 위치 - 동근 위치)를 통해 길이 Path를 구하고
최대길이 - Path를 통해 Path의 반대 방향으로 갔을 때의 길이를 구할 수 있다.
2. 상점과 동근이의 위치의 최솟값을 더해준다.
1. dir, idx에 따라 좌표를 1차원으로 봐꿔준다.
private static int func(int dir, int idx) {
switch(dir) {
// 북쪽
case 1 :
// 아무것도 하지 않는다.
return idx;
// 동쪽
case 4 :
// 가로 길이 만큼 더해준다.
return N + idx;
// 남쪽
case 2 :
// 가로 + 세로 + 가로 역방향
return N + M + N - idx;
case 3 :
// 가로 + 세로 + 가로 + 세로 역방향
return N + M + N + M - idx;
}
return 0;
2. 상점과 동근이의 위치의 최솟값을 더해준다.
int sum = 0;
int len = 2 * (N + M);
for(int i : mat) {
int path = Math.abs(x - i);
int num = Math.min(path, len - path);
sum += num;
}
System.out.println(sum);
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class No2564 {
static int N, M, x;
static int[] mat;
public static void main(String[] args) throws IOException {
input();
pro();
}
private static void pro() {
int sum = 0;
int len = 2 * (N + M);
for(int i : mat) {
int path = Math.abs(x - i);
int num = Math.min(path, len - path);
sum += num;
}
System.out.println(sum);
}
private static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
int num = Integer.parseInt(br.readLine());
mat = new int[num];
for(int i=0; i<num; i++) {
st = new StringTokenizer(br.readLine());
int dir = Integer.parseInt(st.nextToken());
int idx = Integer.parseInt(st.nextToken());
idx = func(dir, idx);
mat[i] = idx;
}
st = new StringTokenizer(br.readLine());
int dir = Integer.parseInt(st.nextToken());
int idx = Integer.parseInt(st.nextToken());
x = func(dir, idx);
br.close();
}
private static int func(int dir, int idx) {
switch(dir) {
// 북쪽
case 1 :
// 아무것도 하지 않는다.
return idx;
// 동쪽
case 4 :
// 가로 길이 만큼 더해준다.
return N + idx;
// 남쪽
case 2 :
// 가로 + 세로 + 가로 역방향
return N + M + N - idx;
case 3 :
// 가로 + 세로 + 가로 + 세로 역방향
return N + M + N + M - idx;
}
return 0;
}
}