/ BOJ

BOJ_10709_기상캐스터_JAVA

문제 : 기상캐스터

링크 : BOJ_10709_기상캐스터

접근 방식

주어진 범위만큼 배열을 생성하고, 값을 읽어와서 c일경우 0, .일경우 -1을 할당한다.

만들어진 배열을 순회하며 0을 찾은 뒤, 0의 위치에서 왼쪽으로 탐색하며 -1일 경우, 1씩 증가시키며 값을 덮어씌워준다. 우방향 탐색중 벽을 만나거나 0이 아닌 수를 만나면 그 자리에서 멈추도록 하면 된다.

10709_1

문제 페이지에 다음과 같이 그림으로 주어지는 힌트가 있어 가져왔다.

풀이 방법

  1. 가로와 세로 정보를 입력받아 저장한다.

  2. 가로, 세로만큼 2차원 배열을 생성하여 값을 읽어와 배열에 저장한다.

  3. 값을 저장 할 떄, .일 경우, -1을 저장하고, c일 경우, 0을 저장한다.

  4. 만들어진 배열을 순회하면서, 값이 0인 배열을 만날 경우, 카운트 변수를 초기화하고, 해당 위치부터 오른쪽으로 탐색하면서 카운트를 1 증가시키며 배열에 덮어씌운다.

  5. 탐색하던 중 벽을 만나거나, 오른쪽에 있는 수가 이미 구름이 있던자리, 즉 0이면 그 자리에서 멈추고 탐색을 종료한다.

  6. 배열의 연속된 값을 모두 더한 값과 현재 저장되어있는 최댓값을 비교하여 더 큰 수를 최댓값에 담는다.

  7. 모든 반복이 종료된 후 2차원 배열 정보를 출력한다.

소스 코드


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BOJ_10709_기상캐스터 {

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

		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(in.readLine()," ");

		int H = Integer.parseInt(st.nextToken());
		int W = Integer.parseInt(st.nextToken());
		int[][] arr = new int[H][W];

		for(int i=0;i<H;i++) {
			char[] chars = in.readLine().toCharArray();
			for(int j=0;j<W;j++) {
				if(chars[j]=='c') {
					arr[i][j] = 0;
				}else {
					arr[i][j] = -1;
				}
			}
		}
		for(int i=0;i<H;i++) {
			for(int j=0;j<W;j++) {
				if(arr[i][j] == 0) {
					int cnt = 0;
					for(int k=j+1;k<W;k++) {
						if(arr[i][k] == -1) {
							arr[i][k] = ++cnt;
						}else if(arr[i][k]==0) {
							break;
						}

					}
				}
			}
		}
		StringBuilder sb = new StringBuilder();
		for(int i=0;i<H;i++) {
			for(int j=0;j<W;j++) {
				sb.append(arr[i][j]).append(" ");
			}
			sb.setLength(sb.length()-1);
			sb.append('\n');
		}
		System.out.print(sb);
	}

}