Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 웹개발
- 정수내림차순으로배치하기
- 프로그래밍
- algorithm
- 알고리즘
- 수박수박수박수박수?
- 웹
- 부스트코스
- Linux
- 웹프로그래밍
- 공부
- 이클립스
- 필기
- 백준
- java
- 건보필기
- 연결요소의개수
- HTML
- BOJ
- CSS
- 코딩
- 프로그래머스
- 중소기업면접
- 후기
- 농은면접
- 확인문제
- 필기후기
- 한국재정정보원
- 인강
- 프로그래밍언어
Archives
- Today
- Total
공부하는 히욤이
[BOJ] 7576. 토마토 본문
BaekJoon 7576. 토마토
* 문제의 저작권은 BOJ 및 문제를 만든 사람에게 있습니다.
[문제 접근]
BFS 문제로 유명한 토마토
토마토가 동시다발적으로 익어가야 하기 때문에 시작 할 때 익은 토마토를 전부 큐에 넣어줬다.
넣은 토마토를 상,하,좌,우 4방향으로 검사해서 안 익은 토마토는 1로 바꿔 주고 날짜를 +1씩 해주고 큐에 넣어 준다.
while문이 끝나고 나면 박스를 전부 돌아서 토마토가 다 익었는지 확인 한다.
하나라도 안 익은 토마토가 있으면 -1, 전부 다 익었으면 마지막 큐의 날짜 값을 출력한다.
지난번에 풀 때는 boolean 2차배열을 이용해 좌표 값을 방문 했는지도 확인했었는데 이번에는 방문 배열을 사용하지 않았다.좌표 값이 0일 때만 방문하니깐 방문하고 나면 0에서 1로 바뀌기 때문에 굳이 방문 확인용 배열을 만들지 않아도 되는 것 같다.
[코드]
최근에 푼 코드
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Main_75762 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int M = sc.nextInt(); //가로
int N = sc.nextInt(); //세로
int[][] box = new int[N][M]; //상자
int day = 0; // 날짜
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
box[i][j] = sc.nextInt();
}
}
Queue<Cord> queue = new LinkedList<>();
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (box[i][j] == 1) { //익은 토마토를 모두 큐에 저장
queue.add(new Cord(i, j, 0));
}
}
}
while (!queue.isEmpty()) {
Cord temp = queue.poll();
day = temp.day;
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
for (int i = 0; i < 4; i++) {
int nx = temp.x + dx[i];
int ny = temp.y + dy[i];
if (nx < N && nx >=0 && ny < M && ny >=0) {
if (box[nx][ny] == 0) {
box[nx][ny] = 1;
queue.add(new Cord(nx, ny, temp.day+1));
}
}
}
}
boolean flag = false; //토마토가 전부 다 익었는지 판별할 변수
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (box[i][j] == 0) { //안 익은 토마토가 있음
flag = true;
break;
} else {
continue;
}
}
if (flag) {
day = -1;
break;
}
}
System.out.println(day);
}
static class Cord{
int x;
int y;
int day;
public Cord(int x, int y, int day) {
this.x = x;
this.y = y;
this.day = day;
}
}
}
BFS 처음 배울 때 풀어본 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[][] map = new int[M][N];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
Queue<Cord> queue = new LinkedList<>();
boolean[][] visited = new boolean[M][N];
int day = 0;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] == 1) {
if (visited[i][j] == true) {
continue;
}
if (visited[i][j] == false) {
queue.add(new Cord(i, j, 0));
visited[i][j] = true;
}
}
}
};
while (!queue.isEmpty()) {
Cord temp = queue.poll();
for (int k = 0; k < 4; k++) {
int nx = temp.x + dx[k];
int ny = temp.y + dy[k];
if (nx>=0 && ny >=0 && nx <M && ny<N) {
if (visited[nx][ny] == false) {
visited[nx][ny] = true;
if (map[nx][ny] == 0) {
map[nx][ny] = 1;
queue.add(new Cord(nx, ny, temp.day+1));
}
}
}
}
day = temp.day;
}
boolean flag = false;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (map[i][j] == 0) {
flag = true;
break;
}
}
if (flag) {
day = -1;
}
}
System.out.println(day);
}
static class Cord{
int x;
int y;
int day;
public Cord(int x, int y, int day) {
this.x = x;
this.y = y;
this.day = day;
}
}
}
'Algorithm > BaekJoon' 카테고리의 다른 글
[BOJ] 2667. 단지번호붙이기 (0) | 2020.04.11 |
---|---|
[BOJ] 11724. 연결 요소의 개수 (0) | 2020.04.11 |
[BOJ] 1592. 영식이와 친구들 (0) | 2020.04.10 |
[BOJ] 6588. 골드바흐의 추측 (0) | 2020.02.13 |
[BOJ] 1929. 소수 구하기 (0) | 2020.02.13 |