개발자 톡
연습문제 톡
[21년 재직자 대회 예선] 좌석 관리
좌석관리, 런타임에러가 나옵니다...
- 등록일
- 2022-01-09 15:17:14
- 조회수
- 762
- 작성자
- zaza1994
예제 테스트케이스는 잘 돌아갑니다.
제가 만든 테스트케이스들도 잘 돌아가고요.
근데 제출을 하면 1번 빼고는 나머지는 전부 런타임에러입니다.
메모리 관리를 못한건가요...?
계산해봐도 그건 아닌거 같은데 ㅠㅠ
도와주세요
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
static int[][] map;
static LinkedList list;
static HashSet isIn, isOut;
static int N, M;
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
isIn = new HashSet<>();
isOut = new HashSet<>();
list = new LinkedList();
int Q = Integer.parseInt(st.nextToken());
map = new int[N+1][M+1];
for(int q = 0; q < Q; q++) {
st = new StringTokenizer(br.readLine());
String cmd = st.nextToken();
int id = Integer.parseInt(st.nextToken());
if(cmd.equals("In")) in(id);
else out(id);
}
}
static void out(int id) {
if(!isIn.contains(id)) {
System.out.println(id + " didn't eat lunch"); return;
}
if(isOut.contains(id)) {
System.out.println(id + " already left seat."); return;
}
for(Pair p : list) {
if(p.id == id) {
System.out.println(id + " leaves from the seat (" + p.r + ", " + p.c + ").");
isOut.add(id);
list.remove(p);
map[p.r][p.c]= 0;
}
}
}
static void in(int id) {
if(isIn.contains(id)) {
if(isOut.contains(id)) {
System.out.println(id + " already ate lunch"); return;
} else {
System.out.println(id + " already seated."); return;
}
}
checkIn(id);
}
static int[] dr = {-1,0,1,0};
static int[] dc = {0,1,0,-1};
static void checkIn(int id) {
double maxD = 0;
int max_i = 0;
int max_j = 0;
for(int i = 1; i < N+1; i++) {
for(int j = 1; j < M+1; j++) {
boolean isNear = false;
for(int d = 0; d < 4; d++) {
int nr = i + dr[d];
int nc = j + dc[d];
if(nr > 0 && nr < N+1 && nc > 0 && nc < M+1 && map[nr][nc] != 0) {
isNear = true;
break;
}
}
if(!isNear && map[i][j] == 0) {
double minD = Double.MAX_VALUE;
for(Pair p : list) {
int r1 = Math.abs(p.r - i);
int r2 = Math.abs(p.c - j);
double D = Math.sqrt(r1*r1 + r2*r2);
if(D < minD) minD = D;
}
if(minD > maxD) {
maxD = minD;
max_i = i;
max_j = j;
}
}
}
}
if(max_i == 0 && max_j == 0) System.out.println("There are no more seats.");
else {
System.out.println(id + " gets the seat (" + max_i + ", " + max_j + ").");
list.add(new Pair(max_i,max_j,id));
map[max_i][max_j] = id;
isIn.add(id);
}
}
static class Pair{
int r, c, id;
Pair(int r, int c, int id){
this.r = r; this.c = c; this.id = id;
}
}
}
#[21년_재직자_대회_예선]_좌석_관리
#좌석관리