개발자 톡
연습문제 톡
장애물 인식 프로그램
장애물 인식 프로그램 TC4
- 등록일
- 2023-11-03 00:55:35
- 조회수
- 421
- 작성자
- king01286
고민고민하다 도저히 모르겠어서 올립니다..
나머진 다 괜찮은데 TC4에서만 메모리 초과가 발생하네요
특정 케이스만 안되는거면 반례가 분명 있는거 같은데 혹시 알려주실 분 계신가요 ㅜㅜ
import java.io.*;
import java.util.*;
public class Main {
// m - 장애물 크기
// res - 장애물 크기 저장하는 배열
static int n, m;
static int[][] map;
static List<Integer> res;
static Queue<Point> q;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
res = new ArrayList<>();
q = new LinkedList<>();
n = Integer.parseInt(br.readLine());
map = new int[n + 2][n + 2];
// 맵 저장
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine());
String s = st.nextToken();
for (int j = 1; j <= n; j++) {
map[i][j] = s.charAt(j - 1) - '0';
}
}
// bfs 사용해서 1,1 부터 탐색
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (map[i][j] == 1) {
bfs(i, j);
}
}
}
res.sort(Comparator.naturalOrder());
System.out.println(res.size());
for (int i : res) {
System.out.println(i);
}
}
// 큐 사용해서 m 크기 구하기
public static void bfs(int x, int y) {
q.offer(new Point(x, y));
while(!q.isEmpty()) {
Point p = q.poll();
x = p.x;
y = p.y;
solve(x, y);
}
// m 값 list 에 추가 후 초기화
if (m != 0) {
res.add(m);
m = 0;
}
}
// 네 방향 검사하면서 큐에 좌표값 저장
public static void solve(int x, int y) {
if(map[x][y] == 1) {
map[x][y] = 0;
m++;
}
if(map[x][y + 1] == 1) {
q.offer(new Point(x, y + 1));
}
if(map[x + 1][y] == 1) {
q.offer(new Point(x + 1, y));
}
if(map[x][y - 1] == 1) {
q.offer(new Point(x, y - 1));
}
if(map[x - 1][y] == 1) {
q.offer(new Point(x - 1, y));
}
}
public static class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
}
#장애물_인식_프로그램
#tc4
#메모리초과
#메모리
#자바