connecting the dots
[BOJ/Java] 2564 : 경비원 본문
문제
풀이
블록을 가로지르지 않고 주어진 상점까지의 최소 거리를 모두 더해주어야 하는 문제
나의 풀이 방법은 다음과 같다
- Store라는 클래스를 만들어주고 location과 direction을 저장할 수 있도록 했다
- 동근이의 direction을 기준으로 왼쪽/오른쪽 direction을 리턴해주는 left/right 함수를 만들었다
- 동근이의 direction에 따라 거리를 구한다
사실 direction을 찾아준 거 외에는 모든 경우의 수를 따져서 푼 문제 / 이렇게 가장 바깥쪽만 사용하는 문제는 직선이라고 생각하고 배열로 풀면 더 간단할 수 있음을 알게 됐다 / 다시 풀어봐야겠다
코드
import java.util.*;
import java.io.*;
public class Main {
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
public static void main(String[] args) throws Exception {
st = new StringTokenizer(in.readLine());
int w = Integer.parseInt(st.nextToken());
int h = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(in.readLine());
Store[] store = new Store[n];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(in.readLine());
store[i] = new Store(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
st = new StringTokenizer(in.readLine());
int dongDir = Integer.parseInt(st.nextToken());
int dongLocation = Integer.parseInt(st.nextToken());
int sum = 0;
for (int i = 0; i < n; i++) {
if (store[i].dir == dongDir) {
sum += Math.abs(store[i].location - dongLocation);
} else if (store[i].dir == opposite(dongDir)) {
if (dongDir <= 2) { // 동근이가 가로축에 있으면
sum += h + Math.min(store[i].location + dongLocation, 2 * w - store[i].location - dongLocation);
} else {
sum += w + Math.min(store[i].location + dongLocation, 2 * h - store[i].location - dongLocation);
}
} else if (store[i].dir == left(dongDir)) {
if (dongDir == 2) {
sum += dongLocation + h - store[i].location;
} else if (dongDir == 3) {
sum += dongLocation + w - store[i].location;
} else if (dongDir == 1) {
sum += w - dongLocation + store[i].location;
} else {
sum += w - store[i].location + h - dongLocation;
}
} else {// 오른쪽
if (dongDir == 2) {
sum += w - dongLocation + h - store[i].location;
} else if (dongDir == 3) {
sum += h - dongLocation + store[i].location;
} else if (dongDir == 1) {
sum += dongLocation + store[i].location;
} else {
sum += w - store[i].location + dongLocation;
}
}
}
System.out.println(sum);
}
static int left(int d) {
if (d == 1)
return 4;
else if (d == 3)
return 1;
else if (d == 2)
return 3;
else
return 2;
}
static int right(int d) {
if (d == 1)
return 3;
else if (d == 3)
return 2;
else if (d == 2)
return 4;
else
return 1;
}
static int opposite(int d) {
if (d == 1)
return 2;
else if (d == 3)
return 4;
else if (d == 2)
return 1;
else
return 3;
}
static class Store {
int dir, location;
Store(int dir, int location) {
this.dir = dir;
this.location = location;
}
}
}
느낀점
- 나는 확실히 Class 하나 만들어서 여러 정보를 저장하는게 편하다
- 이름을 명확하게 하는게 덜 헷갈린다
'algorithm > BOJ' 카테고리의 다른 글
[BOJ/Java] 16234 : 인구이동 (0) | 2021.03.16 |
---|---|
[BOJ/Java] 17140 : 이차원 배열과 연산 (0) | 2021.03.16 |
[BOJ/Java] 2573 : 빙산 (0) | 2021.02.20 |
[BOJ/Java] 2502 : 떡 먹는 호랑이 (0) | 2021.02.20 |
[BOJ/Java] 15686 : 치킨 배달 (0) | 2021.02.19 |