✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/SW Expert Academy
[SW2383] 점심 식사시간
yeomss
2022. 10. 8. 22:40
SW Expert Academy - 점심 식사 시간
문제 링크
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제 입출력
9
0 0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 8
7 0 0 0 0 1 0 0 0
0 0 0 0 0 1 1 0 0
0 0 0 0 0 0 0 0 0
1 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
#1 18
문제 풀이
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.StringTokenizer;
public class Solution {
static int ans, T, N, nodeSize;
static int[] tgt;
static List<Node> nodes = new ArrayList<>();
static List<Stairs> stairs = new ArrayList<>();
static boolean flag = false;
static int cnt;
static Queue<Node> wa = new ArrayDeque<>();
static Queue<Node> a = new ArrayDeque<>();
static Queue<Node> wb = new ArrayDeque<>();
static Queue<Node> b = new ArrayDeque<>();
static List<Node> res = new ArrayList<>(); // 이동 완료한 사람들
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
T = Integer.parseInt(br.readLine());
for (int t = 1; t <= T; t++) {
N = Integer.parseInt(br.readLine());
// 초기화
ans = Integer.MAX_VALUE;
nodes.clear();
stairs.clear();
for (int i = 0, idx = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
int m = Integer.parseInt(st.nextToken());
if (m == 0) continue;
else if (m == 1) nodes.add(new Node(i, j, ++idx, 0));
else stairs.add(new Stairs(i, j, m));
}
}
nodeSize = nodes.size();
tgt = new int[nodeSize];
// 탐색
perm(0);
// 출력
sb.append("#").append(t).append(" ").append(ans).append("\n");
// break;
}
System.out.println(sb.toString());
} // end main
// 사람들을 0번, 1번 계단에 배치시키는 함수
private static void perm(int dep) {
if (dep == nodeSize) {
// 초기화
wa.clear();
a.clear();
wb.clear();
b.clear();
res.clear();
for (Node node : nodes) node.wait = 0;
go();
return;
}
for (int i = 0; i < 2; i++) {
tgt[dep] = i;
perm(dep + 1);
}
} // end perm
// 시간을 재면서 사람들이 계단으로 이동하는 함수
private static void go() {
int time = 0;
Stairs s0 = stairs.get(0); // 계단
Stairs s1 = stairs.get(1); // 계단
while (true) {
time++;
if (res.size() == nodeSize) {
ans = Math.min(ans, time + 1);
return;
}
// 0번 계단 입구에 입구까지 온 사람들을 대기 시킨다.
// 1번 계단 입구에 입구까지 온 사람들을 대기 시킨다.
for (int i = 0; i < nodeSize; i++) {
if (tgt[i] == 0) {
Node n = nodes.get(i); // 사람
int dis = extent(n.y, n.x, s0.y, s0.x);
if (dis == time) wa.add(n);
} else if (tgt[i] == 1) {
Node n = nodes.get(i); // 사람
int dis = extent(n.y, n.x, s1.y, s1.x);
if (dis == time) wb.add(n);
}
}
// 허용 가능한 3명만큼 계단에 배치한다.
while (true) {
if (a.size() < 3 && !wa.isEmpty()) a.add(wa.poll());
else break;
}
while (true) {
if (b.size() < 3 && !wb.isEmpty()) b.add(wb.poll());
else break;
}
// 0번 계단을 통해서 내려가는 과정 시간 세기
// 1번 계단을 통해서 내려가는 과정 시간 세기
// 도착하고 나서 그 다음부터 시간을 센다.
for (Node node : a) node.wait++;
for (Node node : b) node.wait++;
// 만약 계단을 다 내려갔다면 res 배열에 추가
for (Node node : a) if (node.wait == s0.time) res.add(a.poll());
for (Node node : b) if (node.wait == s1.time) res.add(b.poll());
}
} // end go
private static int extent(int y1, int x1, int y2, int x2) {
return Math.abs(y1 - y2) + Math.abs(x1 - x2);
} // end extent
static class Node {
int y, x;
int no; // 사람의 번호
int wait; // 기다린 시간
public Node(int y, int x, int no, int wait) {
this.y = y;
this.x = x;
this.no = no;
this.wait = wait;
}
@Override
public String toString() {
return "Node [y=" + y + ", x=" + x + ", no=" + no + ", wait=" + wait + "]";
}
} // end Node
static class Stairs {
int y, x;
int time; // 내려가는 데 걸리는 시간
public Stairs(int y, int x, int time) {
super();
this.y = y;
this.x = x;
this.time = time;
}
@Override
public String toString() {
return "Stairs [y=" + y + ", x=" + x + ", time=" + time + "]";
}
} // end Stairs
}
- 중복 순열을 이용해서 계단에 배치시킨다.
- 그런 다음 계단 입구 리스트, 계단 리스트를 만든다. 큐를 이용했다.
- 먼저 계단 입구에 대기시킨 다음에 계단에서 누군가가 다 내려가면 계단에 넣는다.
- 차량 정비소와 비슷한 문제.
# sw 점심식사시간 java # swea 점심 식사시간 java # sw 점심식사시간 테스트케이스
728x90