1. 문제
https://www.acmicpc.net/problem/10709
10709번: 기상캐스터
출력은 H 행으로, 각 행에는 공백으로 구분된 W 개의 정수를 출력한다. 출력의 i 번째 행 j 번째 정수 (1 ≦ i ≦ H, 1 ≦ j ≦ W) 는, 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시
www.acmicpc.net
2. 풀이
간단한 구현 및 시뮬레이션 문제이다.
각 줄의 입력을 받아 H, W, 배열을 초기화 해준 후, 조건에 맞게 코드를 작성하면 해결된다.
첫번 째로 선정한 조건은 배열의 첫 번째 열의 값이 '.'이냐를 판단하는 것이다.
이때는 반복문을 돌면서 'c'가 나올 때 까지 -1을 결과 배열에 넣어줘야 하므로 first_c_flag 변수를 선언하고 false를 유지하게끔 설계하였다.
두번 째로 선정한 조건은 배열의 값이 'c'일 때이다.
이때는 그 자리에는 구름이 있는 것이기에 몇 분후에 구름이 도착하는지를 더하는 count 변수를 0으로 초기화해준다.
그리고 그 자리와 일치하는 결과 배열의 값에 0을 넣어준 후 first_c_flag를 true로 바꾼다.
이는 첫 번째 조건에서 계속 -1을 입력하다가 c를 만난 순간부터는 카운트를 해야하기 때문이다.
세번 째로 선정한 조건은 first_c_flag가 false일 때이다.
이때는 간단하게 결과 배열의 값에 -1을 더해준 후 continue를 해준다.
마지막 네번 째로 선정한 조건은 배열의 값이 '.'일 때이다.
이때도 간단하게 결과 배열에 지금까지 더한 count를 넣어주면 된다.
마지막으로 배열을 출력하면 완료!
3. 소스 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main (String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int H = Integer.parseInt(st.nextToken());
int W = Integer.parseInt(st.nextToken());
char[][] sky = new char[H][W];
for (int i = 0; i < H; i++) {
String input = br.readLine();
for (int j = 0; j < W; j++) {
sky[i][j] = input.charAt(j);
}
}
int[][] result = new int[H][W];
int count = 0;
boolean first_c_flag = true;
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (j == 0 && sky[i][j] != 'c') { // 첫번 째 조건
first_c_flag = false;
}
if (sky[i][j] == 'c') { // 두번 째 조건
count = 0;
result[i][j] = 0;
first_c_flag = true;
}
if (!first_c_flag) { // 세번 째 조건
result[i][j] = -1;
continue;
}
if (sky[i][j] == '.') { // 네번 째 조건
result[i][j] = count;
}
count += 1;
}
}
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
bw.write(result[i][j] + " ");
}
bw.write("\n");
}
bw.flush();
bw.close();
br.close();
}
}