반응형
package com.ji.beakjoon;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/**
 * 토마토
 * @author ji
 *
 */
public class Tomato {

	public static void main(String[] args) throws IOException {
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        Scanner sc = new Scanner(System.in);
        int[] dy = { -1, 1, 0, 0 };//상하좌우위아래
        int[] dx = { 0, 0, -1, 1 };
        int M = sc.nextInt(), N = sc.nextInt();

        int[][] tomato = new int[N][M];
        int cnt = 0, days = 0;
        Queue<int[]> que = new LinkedList<>();

        //행렬값 초기화
        for (int n = 0; n < N; n++) {
            for (int m = 0; m < M; m++) {
                tomato[n][m] = sc.nextInt();
                //시작 노드를 큐에 넣음
                if (tomato[n][m] == 1) {
                    que.add(new int[] { n, m });
                }else if (tomato[n][m] == 0) {
                	//익지 않은 토마토 개수 
                    cnt++;
                }
            }
        }

        //익지 않은 토마토 가 있고, 큐에 노드가 있으면
        while (cnt > 0 && !que.isEmpty()) {
            for (int s = que.size(); s > 0; s--) {
                int[] cur = que.poll();//익은 토마토 위치

                //상하좌우아래 검사
                for (int k = 0; k < 4; k++) {
                    int ny = cur[0] + dy[k]; //가로
                    int nx = cur[1] + dx[k]; //세로

                    //익은 토마토만 통과
                    if (ny < 0 || nx < 0 || ny >= N || nx >= M || tomato[ny][nx] != 0)
                        continue;
                               
                    cnt--;
                    tomato[ny][nx] = 1;
                    //익은 토마토 큐에 저장
                    que.add(new int[] { ny, nx });
                }
            }
            //날짜 증가
            days++;
        }
        
        String result = String.valueOf(cnt == 0 ? days : -1);
        bw.write(String.valueOf(result) + "\n");
        bw.flush();
		bw.close();
    }

}
728x90

'[개발관련] > 코테준비' 카테고리의 다른 글

[백준] 문자열 폭발  (0) 2021.06.13
[백준] 듣보잡  (0) 2021.06.13
[백준] 주식투자  (0) 2021.06.13
[백준] 유기농 배추  (0) 2021.06.13
[백준] 숨바꼭질  (0) 2021.06.13
반응형
package com.ji.beakjoon;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 주식투자
 * @author ji
 *
 */
public class StockInvest {

	static int _companyCnt = 3;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		int testCase = Integer.parseInt(br.readLine());

		for (int t = 0; t < testCase; t++) {

			int day = Integer.parseInt(br.readLine());
			int[][] stockPrices = new int[day][_companyCnt];

			// 데이터 초기화
			for (int i = 0; i < day; i++) {
				String[] stockPricesStr = br.readLine().split(" ");
				for (int j = 0; j < _companyCnt; j++)
					stockPrices[i][j] = Integer.parseInt(stockPricesStr[j]);
			}

			int result = 0;
			for (int dI = 0; dI < day; dI++) {
				// 각 날짜 별 최대값
				int max = 0;
				for (int cI = 0; cI < _companyCnt; cI++) {
					if (max < stockPrices[dI][cI])
						max = stockPrices[dI][cI];
				}
				result += max;
			}

			bw.write(String.valueOf(result) + "\n");

		}

		br.close();
		bw.flush();
		bw.close();
	}

}
728x90

'[개발관련] > 코테준비' 카테고리의 다른 글

[백준] 듣보잡  (0) 2021.06.13
[백준] 토마토  (0) 2021.06.13
[백준] 유기농 배추  (0) 2021.06.13
[백준] 숨바꼭질  (0) 2021.06.13
[백준] ATM  (0) 2021.06.13
반응형
package com.ji.beakjoon;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class OrganicCabbage {

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		int testCase = Integer.valueOf(br.readLine());

		for (int t = 0; t < testCase; t++) {

			String[] plantCabbageInfo = br.readLine().split(" ");
			int fieldCntHorizantal = Integer.valueOf(plantCabbageInfo[0]); // 행렬 가로 길이
			int fieldCntVertical = Integer.valueOf(plantCabbageInfo[1]);// 행렬 세로 길이
			int plantCabbageCnt = Integer.valueOf(plantCabbageInfo[2]);//행렬에 1이 있는 위치
			int[][] graph = new int[fieldCntHorizantal + 1][fieldCntVertical + 1];

			for (int i = 0; i < plantCabbageCnt; i++) {
				String[] comPairNum = String.valueOf(br.readLine()).split(" ");
				int a = Integer.parseInt(comPairNum[0]);
				int b = Integer.parseInt(comPairNum[1]);
				graph[a][b] = 1;
			}

			int count = 0;
			for (int j = 0; j < fieldCntVertical ; j++) {
				for (int i = 0; i < fieldCntHorizantal ; i++) {
					if (graph[i][j] == 1) {
						//행렬을 돌면서 처음 1이 나온 경우 count
						count++;
						
						//점화식
						//1로 시작하면 동서남북 검사 후 동서남북에 걸리면 -1로 변환
						//1주변에 1이 없을 경우 재귀 탈출
						dfs(graph, i, j);
					}
				}
			}
			
			bw.write(String.valueOf(count)+"\n");
		}

		br.close();
		bw.flush();
		bw.close();

	}

	static void dfs(int[][] graph, int i, int j) {
		int m = graph.length; //가로 행렬 크기
		int n = graph[0].length; // 세로 행렬 크기
		
		//행렬에서 0이거나 마지막에 있는 값일 경우 재귀 탈출
		if (i < 0 || i >= m || j < 0 || j >= n || graph[i][j] != 1)
			return;
		
		//처음 1이 나오고 근처에 있는 1일 경우 -1로 바꿈
		graph[i][j] = -1;

		dfs(graph, i - 1, j);// 위
		dfs(graph, i + 1, j);// 아래
		dfs(graph, i, j - 1);// 왼쪽
		dfs(graph, i, j + 1);// 오른쪽
	}

}
728x90

'[개발관련] > 코테준비' 카테고리의 다른 글

[백준] 토마토  (0) 2021.06.13
[백준] 주식투자  (0) 2021.06.13
[백준] 숨바꼭질  (0) 2021.06.13
[백준] ATM  (0) 2021.06.13
[백준] 쇠막대기  (0) 2021.06.13

+ Recent posts