문제
해결 방안 고민
JOI시?!
가로, 세로(width, height) 의 길이가 1km H x W
북쪽으로부터 i 번째, 서쪽으로부터 j 번째 있는 구역을(i, j) 로 표시 => 각 구역에는 구름이 있을 수도, 없을 수도 있음
모든 구름은 1분이 지나면 1킬로미터씩 동쪽으로 이동 => 날씨가 좋으면 외부에서 구름이 이동해오는 경우가 없음
여러분은 각 구역에 대해서 지금부터 몇 분뒤 처음으로 하늘에 구름이 오는지를 예측하는 일을 맡았음
각 구역에 대해 지금부터 몇 분 뒤 처음으로 하늘에 구름이 오는지를 구하기
== 입력 ==
1 + H(세로) 행으로 주어짐
H개행의 i번째 행에는 W 문자의 문자열이 주어짐
이어진 H개의 행 i번째 행에 W문자의 문자열이 주어짐
구름이 있는 경우 영어 소문자 'c', 구름이 없는 경우 문자 '.'가 주어짐
== 출력 ==
W 개의 정수 출력,
지금부터 몇 분 후에 처음으로 구역(i, j) 에 구름이 뜨는지 표시
단 처음부터 구역 (i, j) 에 구름이 떠 있었던 경우에는 0을, 몇 분이 지나도 구름이 뜨지 않을 경우 -1을 출력
Markdown
복사
•
2차원 배열을 활용하지 않으면서 문제를 해결할 수 있는 방법에 대해 고민했다.
•
최대한 배열을 생성하지 않으면서 문제를 해결하는 방향으로 문제풀이를 진행하였다.
해결 방법
•
이중 for문과 조건문을 활용하면 간단하게 해결되는 문제였다.
•
출력할 때는 시간 단축을 위해 BufferedWriter를 활용하였다.
•
charAt() 을 사용하여 문자열의 각 요소들을 비교하는 로직으로 구성하였다.
코드
•
BufferedWriter 의 경우 버퍼를 잡아 놓았기 때문에 반드시 사용한 후에 flush() / close()를 해주어야 한다.
import java.io.*;
import java.util.*;
// 기상캐스터 - 실버 5
public class Baek10709 {
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(), " ");
// H, W 입력
int H = Integer.parseInt(st.nextToken());
int W = Integer.parseInt(st.nextToken());
int count = 0; // c가 나올 때마다 초기화 시켜줌
for (int i = 0; i < H; i++) {
String str = br.readLine();
// 문자마다 비교하기
for (int j = 0; j < W; j++) {
if (str.charAt(j) == '.' && count == 0) {
bw.write(-1 + " ");
} else if (str.charAt(j) == 'c') {
bw.write(0 + " ");
count = 1;
} else if (str.charAt(j) == '.' && count != 0) {
bw.write(count + " ");
count++;
}
}
count = 0;
bw.write("\n");
}
bw.flush();
br.close();
bw.close();
}
}
Java
복사