BOJ_10709_기상캐스터_JAVA
문제 : 기상캐스터
링크 : BOJ_10709_기상캐스터
접근 방식
주어진 범위만큼 배열을 생성하고, 값을 읽어와서 c일경우 0, .일경우 -1을 할당한다.
만들어진 배열을 순회하며 0을 찾은 뒤, 0의 위치에서 왼쪽으로 탐색하며 -1일 경우, 1씩 증가시키며 값을 덮어씌워준다. 우방향 탐색중 벽을 만나거나 0이 아닌 수를 만나면 그 자리에서 멈추도록 하면 된다.
문제 페이지에 다음과 같이 그림으로 주어지는 힌트가 있어 가져왔다.
풀이 방법
-
가로와 세로 정보를 입력받아 저장한다.
-
가로, 세로만큼 2차원 배열을 생성하여 값을 읽어와 배열에 저장한다.
-
값을 저장 할 떄, .일 경우, -1을 저장하고, c일 경우, 0을 저장한다.
-
만들어진 배열을 순회하면서, 값이 0인 배열을 만날 경우, 카운트 변수를 초기화하고, 해당 위치부터 오른쪽으로 탐색하면서 카운트를 1 증가시키며 배열에 덮어씌운다.
-
탐색하던 중 벽을 만나거나, 오른쪽에 있는 수가 이미 구름이 있던자리, 즉 0이면 그 자리에서 멈추고 탐색을 종료한다.
-
배열의 연속된 값을 모두 더한 값과 현재 저장되어있는 최댓값을 비교하여 더 큰 수를 최댓값에 담는다.
-
모든 반복이 종료된 후 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);
}
}