Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 132 additions & 0 deletions 코테반/4회차/11559_PuyoPuyo/bj_11559_PuyoPuyo_박경모.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
import java.io.BufferedReader;
//import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

public class Main {

static class Point{
int y, x;

public Point(int y, int x) {
super();
this.y = y;
this.x = x;
}
}
static int[] dy = {0, 0, 1, -1};
static int[] dx = {1, -1, 0, 0};
public static void main(String[] args) throws IOException {
//System.setIn(new FileInputStream("input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[][] map = new char[12][6];
int ANS = 0;
for(int i=0; i<12; i++) {
String s = br.readLine();
for(int j=0; j<6; j++) {
map[i][j] = s.charAt(j);
}
}

while(true) {
// 출력용
// for(int i= 0; i<12; i++) {
// for(int j=0; j<6; j++) {
// System.out.print(map[i][j] + " ");
// }
// System.out.println();
// }
// System.out.println();
int flag = 0;
boolean[][] visited = new boolean[12][6];
boolean[] toPullDown = new boolean[6];

for(int i= 11; i>=0; i--) { // 밑에서부터 탐색
for(int j=0; j<6; j++) {
if(!visited[i][j] && map[i][j] != '.') {
flag += bfs(map, visited, new Point(i,j), toPullDown);
}
}
}
if(flag == 0) {
break;
}else {
pullDown(map, toPullDown);
ANS++;
}
}

// 출력용
// for(int i= 0; i<12; i++) {
// for(int j=0; j<6; j++) {
// System.out.print(map[i][j] + " ");
// }
// System.out.println();
// }

System.out.println(ANS);
}

static int bfs(char[][] map, boolean[][] visited, Point start, boolean[] toPullDown) {
Queue<Point> queue = new ArrayDeque<>();
List<Point> toDelList = new ArrayList<>();
queue.offer(start);
toDelList.add(start);
visited[start.y][start.x] = true;
char initColor = map[start.y][start.x];
int cnt = 1;
while(!queue.isEmpty()) {
Point temp = queue.poll();
int cy = temp.y;
int cx = temp.x;

for(int i=0; i<4; i++) {
int ny = cy + dy[i];
int nx = cx + dx[i];

if(ny<0 || ny>11 || nx<0 || nx>5)
continue;

if(!visited[ny][nx] && map[ny][nx] == initColor) {
Point nextPoint = new Point(ny, nx);
queue.offer(nextPoint);
toDelList.add(nextPoint);
visited[ny][nx] = true;
cnt++;
}
}
}
// 4개 이상 블럭은 터트리고 끄집어내리기
if(cnt >=4 ) {
for(Point ob: toDelList) {
map[ob.y][ob.x] = '.';
toPullDown[ob.x]= true;
}
}

return cnt>=4 ? 1 : 0;
}

static void pullDown(char[][] map, boolean[] toPullDown) {
for(int i=0; i<6; i++) {
if(toPullDown[i]) {
for(int ground= 11; ground>=1; ground--) {
for(int j=ground-1; j>=0; j--) {
if(map[ground][i] == '.' && map[j][i] != '.') {
map[ground][i] = map[j][i];
map[j][i] = '.';
ground--;
}

}
}
}
}
}


}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
import java.io.BufferedReader;
//import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
static int N;
static int[] dy = {0, 0, 1, -1};
static int[] dx = {1, -1, 0, 0};
static int IDX = 1; // 섬 구분용 IDX
static int MIN = Integer.MAX_VALUE;
static class Node{
int y, x;
int time;
public Node(int y, int x, int time) {
super();
this.y = y;
this.x = x;
this.time = time;
}

}
public static void main(String[] args) throws NumberFormatException, IOException {
//System.setIn(new FileInputStream("input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
int[][] map = new int[N][N];
boolean[][] visited = new boolean[N][N];
for(int i=0; i<N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j=0; j<N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}

// 섬 구분 짓기
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(!visited[i][j] && map[i][j] != 0) {
bfs(map, visited, new Node(i,j, -1));
IDX++;
}
}
}
// for (int i = 0; i < N; i++) {
// for (int j = 0; j < N; j++) {
// System.out.print(map[i][j] + " ");
// }
// System.out.println();
// }
// System.out.println();

//섬 탐색하기
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(map[i][j] != 0) {
// System.out.println(i + " : " + j);
bfs2(map, new boolean[N][N], new Node(i,j, 0));
}
}
}
System.out.println(MIN);
}

static void bfs(int[][] map, boolean[][] visited, Node start) {
Queue<Node> queue = new ArrayDeque<>();
queue.offer(start);
visited[start.y][start.x] = true;

while(!queue.isEmpty()) {
Node temp = queue.poll();
int cy = temp.y;
int cx = temp.x;

map[cy][cx] = IDX;

for(int i=0; i<4; i++) {
int ny = cy + dy[i];
int nx = cx + dx[i];

if(ny<0|| ny>N-1|| nx<0 || nx>N-1)
continue;

if(!visited[ny][nx] && map[ny][nx] != 0) {
map[ny][nx] = IDX;
queue.offer(new Node(ny, nx, -1));
visited[ny][nx] = true;
}

}
}

}

static void bfs2(int[][] map, boolean[][] visited, Node start) {
Queue<Node> queue = new ArrayDeque<>();
visited[start.y][start.x] = true;
queue.offer(start);
int startIdx = map[start.y][start.x];

//"BFS는 큐에서 뺀 다음이 아닌, 큐에 넣을 때 방문 체크를 해야 중복 방문이 일어나지 않습니다."

while(!queue.isEmpty()) {
Node temp = queue.poll();
int cy = temp.y;
int cx = temp.x;
int ct = temp.time;

for(int i=0; i<4; i++) {
int ny = cy + dy[i];
int nx = cx + dx[i];

if(ny<0|| ny>N-1|| nx<0 || nx>N-1)
continue;

if(map[ny][nx] !=0 && map[ny][nx] != startIdx) {
MIN = ct<MIN ? ct : MIN;
return;
}

if(!visited[ny][nx] && map[ny][nx] != startIdx) {
queue.offer(new Node(ny, nx, ct+1));
visited[ny][nx] = true;
}
}
}

}

}

This file was deleted.

114 changes: 114 additions & 0 deletions 코테반/4회차/5427_불/bj_5427_불_박경모.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
import java.io.BufferedReader;
//import java.io.FileInputStream;
import java.io.IOException;
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 Main {
static class Node{
int y, x;
int time;
public Node(int y, int x, int time) {
super();
this.y = y;
this.x = x;
this.time = time;
}
}

static int[] dy = {0, 0, 1, -1};
static int[] dx = {1, -1, 0, 0};
static int h, w;
public static void main(String[] args) throws IOException {
//System.setIn(new FileInputStream("input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();

for(int tc=1; tc<=T; tc++) {
StringTokenizer st = new StringTokenizer(br.readLine());
w = Integer.parseInt(st.nextToken());
h = Integer.parseInt(st.nextToken());

char[][] map = new char[h][w];
boolean[][] visited = new boolean[h][w];
Node start = null;
Queue<Node> fireQueue = new ArrayDeque<>();

for(int i=0; i<h; i++) {
String s = br.readLine();
for(int j=0; j<w; j++) {
map[i][j] = s.charAt(j);
if(map[i][j] =='@') {
start = new Node(i, j, 0);
}else if(map[i][j] == '*') {
fireQueue.offer(new Node(i, j, -1));
}
}
}
//bfs
int result = bfs(map, visited, start, fireQueue);
sb.append(result == -1 ? "IMPOSSIBLE" : result);
sb.append("\n");
//System.out.println(result == -1 ? "IMPOSSIBLE" : result);

}
System.out.println(sb);
}

static int bfs(char[][] map, boolean[][] visited, Node start, Queue<Node> fireQueue) {
Queue<Node> queue = new ArrayDeque<>();
queue.offer(start);

while(!queue.isEmpty()) {
int fireIter = fireQueue.size();
for(int i=0; i<fireIter; i++) { // move fire
Node fireTemp = fireQueue.poll();
int fcy = fireTemp.y;
int fcx = fireTemp.x;

for(int j=0; j<4; j++) {
int fny = fcy + dy[j];
int fnx = fcx + dx[j];

if(fny<0 || fny > h-1 || fnx<0 || fnx >w-1)
continue;

if(map[fny][fnx] == '.' || map[fny][fnx] == '@') {
map[fny][fnx] = '*';
fireQueue.offer(new Node(fny, fnx, -1));
}
}
}

int iter = queue.size();
for(int k=0; k<iter; k++) {
Node temp = queue.poll();
int cy = temp.y;
int cx = temp.x;
int ct = temp.time;
visited[cy][cx] = true;

for(int i=0; i<4; i++) {
int ny = cy + dy[i];
int nx = cx + dx[i];

if(ny<0 || ny>h-1 || nx<0 || nx>w-1) {
return temp.time + 1;
}

if(!visited[ny][nx] && map[ny][nx] == '.') {
map[ny][nx] = '@';
queue.offer(new Node(ny, nx, ct+1));
}
}
}

}
return -1;
}
}
Empty file.
Loading