19238๋ฒ: ์คํํธ ํ์
Lv : ๊ณจ๋ 2
1) ํ์ ์์น
ํ์ ์์ ์์น๋ฅผ ๋ฐฐ์ด๋ก ์ ์ฅํ๋ค.
static int[] taxi;
// ํ์ ์์ ์์น
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
taxi = new int[] { x - 1, y - 1 };
2) ์๋ ์์น
Customer ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ถ๋ฐ์ง์ ๋ชฉ์ ์ง๋ฅผ ์ ์ฅcustomers ๋ฆฌ์คํธ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅ//๊ฐ์ฒด ์์ฑ
class Customer {
int[] depart; //์ถ๋ฐ์ง์
int[] dest; //๋์ฐฉ์ง์
int path; //๊ฑฐ๋ฆฌ ์ ์ฅ
boolean arrived; //์๋ฃํ ์๋์ธ์ง
public Customer(int[] depart, int[] dest, int path, boolean arrived) {
super();
this.depart = depart;
this.dest = dest;
this.path = path;
this.arrived = arrived;
}
}
// ์๋์ ์์น ๋ฐฐ์ด
customers = new ArrayList<>(M);
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int x1 = Integer.parseInt(st.nextToken());
int y1 = Integer.parseInt(st.nextToken());
int x2 = Integer.parseInt(st.nextToken());
int y2 = Integer.parseInt(st.nextToken());
Customer cus = new Customer(new int[] { x1 - 1, y1 - 1 }, new int[] { x2 - 1, y2 -1 }, 0, false);
customers.add(cus);
}
ํ ์ฌ์ดํด์์ ์ํํ๋ ๊ณผ์ :
choose)pickUp)dropDown)end ๋ณ์: ์ฐ๋ฃ ๋ถ์กฑ์ด๋ ๋๋ฌ ๋ถ๊ฐ ์ ๋ฐ๋ณต ์ข
๋ฃ ๋ฐ -1 ์ถ๋ ฅ ์ฒ๋ฆฌ
for (int i = 0; i < M; i++) {
end = false; // ์ด๊ธฐํ
// 1) ์ด๋ฒ์ ํฝ์
ํ ์๋์ ๊ณ ๋ฅด๋ ๋ฉ์๋
int custIdx = choose();
if (end) {
break;
}
// 2) ์๋ ํฝ์
ํ๊ธฐ
pickUp(custIdx);
if (end) {
break;
}
// // ์๋์ ๋ชฉ์ ์ง๊น์ง ์ด๋ํ๊ธฐ.
dropDown(custIdx);
if (end) {
break;
}
}
private static int choose() {
//๊ฐ์ฅ ๊ฐ๊น์ด ์๋์ ํฝ์
ํด์ผ ํ๋ค.
minPath = Integer.MAX_VALUE;
minIdx = -1;
// ๊ฐ์ฒด๋ฅผ ๋๊ธฐ
for (int i = 0; i < M; i++) {
Customer cus = customers.get(i);
if (cus.arrived) { // ์ด๋ฏธ ์ฒ๋ฆฌํ ์๋์ด๋ฉด pass
continue;
}
int p = distance(taxi[0], taxi[1], cus.depart[0], cus.depart[1]); // ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ธฐ
if (p == -1) continue;
if (p < minPath) {
minPath = p;
minRow = cus.depart[0];
minCol = cus.depart[1];
minIdx = i;
} else if (p == minPath) {
if (cus.depart[0] < minRow || (cus.depart[0] == minRow && cus.depart[1] < minCol)) {
minRow = cus.depart[0];
minCol = cus.depart[1];
minIdx = i;
}
}
}
//๋ชจ๋ ์๋ ์ ๊ทผ ๋ถ๊ฐ
if( minIdx == -1) {
end = true;
return -1;
}
// ์๋์ ํ์ด ๊ฑฐ ์ฒ๋ฆฌํ๊ธฐ
customers.get(minIdx).arrived = true;
return minIdx;
}
private static void pickUp(int custIdx) {
int targetPath = 0;
int targetX = 0;
int targetY = 0;
// ํ์ ์์น์์ ์๋ depart๊น์ง์ ๊ฑฐ๋ฆฌ
targetX = customers.get(custIdx).depart[0];
targetY = customers.get(custIdx).depart[1];
targetPath = distance(taxi[0], taxi[1], targetX, targetY);
//distance๊ฐ -1๋ก ๋์ค๋ ๊ฒฝ์ฐ๋ end๊ฐ ๋๋๋ก ์ฒ๋ฆฌํด์ฃผ๊ธฐ
if (targetPath == -1 || oil - targetPath < 0) {
end = true;
return;
}
oil -= targetPath;
taxi[0] = targetX;
taxi[1] = targetY;
}
private static void dropDown(int custIdx) {
int departX = customers.get(custIdx).depart[0];
int departY = customers.get(custIdx).depart[1];
int destX = customers.get(custIdx).dest[0];
int destY = customers.get(custIdx).dest[1];
int dist = distance(taxi[0], taxi[1], destX, destY);
if (dist == -1 || oil - dist < 0) { // ๋๋ฌ ๋ถ๊ฐ ๋๋ ์ฐ๋ฃ ๋ถ์กฑ
end = true;
return;
}
oil = oil - dist + dist * 2;
taxi[0] = destX;
taxi[1] = destY;
}
dfs๋ฅผ ์ด์ฉํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
private static int distance(int startX, int startY, int targetX, int targetY) {
boolean[][] visited = new boolean[N][N];
Queue<int[]> q = new LinkedList<>();
q.offer(new int[]{startX, startY, 0}); // {x, y, depth}
visited[startX][startY] = true;
while (!q.isEmpty()) {
int[] cur = q.poll();
int x = cur[0];
int y = cur[1];
int d = cur[2];
// ๋ชฉ์ ์ง ๋์ฐฉ
if (x == targetX && y == targetY) {
return d;
}
for (int k = 0; k < 4; k++) {
int nx = x + di[k];
int ny = y + dj[k];
if (nx >= 0 && nx < N && ny >= 0 && ny < N && map[nx][ny] == 0 && !visited[nx][ny]) {
visited[nx][ny] = true;
q.offer(new int[]{nx, ny, d + 1});
}
}
}
// ๋๋ฌ ๋ถ๊ฐ
return -1;
}
์ด ๋ฌธ์ ์์ ๊ฐ์ฅ ๊น๋ค๋ก์ ๋ ์ ์ ๋๋ฌ ๋ถ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด์๋ค.
์์ฑํ ๊ฑฐ์ ๋ชจ๋ ๋ฉ์๋์์ ๋๋ฌ์ด ๋ถ๊ฐํ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ผ ํ๊ณ , ๋์น๋ ๋ถ๋ถ๋ ๋ง์๋ค.
์ด๋ฐ ์กฐ๊ฑด์ ๊ผผ๊ผผํ๊ฒ ๊ฒํ ํ์ฌ ์ฝ๋๋ฅผ ์์ฑํด์ผ๊ฒ ๋ค...