문제 링크:
문제:
JOI시는 남북방향이 H 킬로미터, 동서방향이 W 킬로미터인 직사각형 모양이다. JOI시는 가로와 세로의 길이가 1킬로미터인 H × W 개의 작은 구역들로 나뉘어 있다. 북쪽으로부터 i 번째, 서쪽으로부터 j 번째에 있는 구역을 (i, j) 로 표시한다.
각 구역의 하늘에는 구름이 있을 수도, 없을 수도 있다. 모든 구름은 1분이 지날 때마다 1킬로미터씩 동쪽으로 이동한다. 오늘은 날씨가 정말 좋기 때문에 JOI시의 외부에서 구름이 이동해 오는 경우는 없다.
지금 각 구역의 하늘에 구름이 있는지 없는지를 알고 있다. 기상청에서 일하고 있는 여러분은 각 구역에 대해서 지금부터 몇 분뒤 처음으로 하늘에 구름이 오는지를 예측하는 일을 맡았다.
각 구역에 대해서 지금부터 몇 분뒤 처음으로 하늘에 구름이 오는지를 구하여라.
입력:
입력은 1 + H 행으로 주어진다.
첫 번째 행에는 정수 H, W (1 ≦ H ≦ 100, 1 ≦ W ≦ 100) 가 공백을 사이에 주고 주어진다. 이것은 JOI시가 H × W 개의 작은 구역으로 나뉘어 있다는 것을 의미한다.
이어진 H 개의 행의 i번째 행 (1 ≦ i ≦ H) 에는 W문자의 문자열이 주어진다. W 개의 문자 중 j번째 문자 (1 ≦ j ≦ W) 는, 구역 (i, j) 에 지금 구름이 떠 있는지 아닌지를 나타낸다. 구름이 있는 경우에는 영어 소문자 'c' 가, 구름이 없는 경우에는 문자 '.' 가 주어진다.
출력:
출력은 H 행으로, 각 행에는 공백으로 구분된 W 개의 정수를 출력한다. 출력의 i 번째 행 j 번째 정수 (1 ≦ i ≦ H, 1 ≦ j ≦ W) 는, 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시한다. 단, 처음부터 구역 (i, j) 에 구름이 떠 있었던 경우에는 0을, 몇 분이 지나도 구름이 뜨지 않을 경우에는 -1을 출력한다.

힌트:

문제이해:
하늘은 여러 칸으로 나뉘어 있고, 각 칸엔 구름이 있거나 없다. 구름이 있는 칸은 c, 없는 칸은 .로 표시된다. 구름은 1분에 오른쪽으로 한 칸씩 이동한다. 이때, 각 칸에 구름이 몇 분 뒤에 오는지를 숫자로 표시해야 한다. 구름이 바로 위에 있으면 0, 왼쪽에서 구름이 오면 몇 분 걸리는지를 적는다. 앞으로도 구름이 오지 않는 칸은 -1로 표시한다.
예를 들어 3행 4열짜리 하늘이 있고, 입력이 아래와 같다고 하자.
c..c
..c.
....
이걸 한 칸씩 왼쪽에서 오른쪽으로 보면서, 구름이 처음 나온 칸엔 0을 적고, 그 다음 칸엔 1, 그다음엔 2처럼 하나씩 더해가면 된다. 구름이 보이지 않는 상태에서 시작하는 칸은 -1로 시작하고, 이전에 구름이 있었다면 거리만큼 숫자를 적는다. 구름이 다시 나오면 또 0부터 시작한다.
결과는 이렇게 된다.
0 1 2 0
-1 -1 0 1
-1 -1 -1 -1
구름이 있으면 0, 그 오른쪽엔 1, 2, 구름이 또 나타나면 다시 0. 구름이 아예 안 오는 줄은 전부 -1.
이건 그냥 각 줄마다 왼쪽부터 보면서 구름이 나왔는지 기억하고, 거리를 세면서 숫자만 적으면 된다. 그렇게 한 줄씩 차례대로 하면 된다. 복잡하게 생각하지 말고, 단순히 한 칸씩 보면서 구름이 있으면 0, 없으면 그전에 구름이 있었는지 확인하고 거리 세면 되는 문제다.

구현 방식:
입력으로 하늘의 세로와 가로 크기를 받고, 그만큼의 칸에 구름이 있는지 없는지를 저장한다. 하늘의 상태는 줄마다 문자열로 들어오고, 각 칸은 문자 하나로 표현된다. 이제 해야 할 일은 각 칸마다 구름이 몇 분 뒤에 도착하는지를 계산하는 것이다. 왼쪽에서 오른쪽으로 한 줄씩 보면서, 구름이 아직 나타나지 않았으면 -1을 적고, 구름이 보이면 0을 적고, 이후 칸부터는 1씩 더한 값을 적는다. 다시 구름이 보이면 0으로 초기화하고 그다음 칸부터 또 1씩 더해가면 된다. 구름이 전혀 없는 줄은 전부 -1이 된다. 출력할 때는 각 줄의 숫자 사이에만 공백을 넣고 줄 끝에는 공백이 없도록 처리하면 된다. 전체 흐름은 입력 받고, 줄마다 순서대로 처리하고, 결과를 출력하는 구조로 이루어지면 된다.
정답 코드:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void ResultPrint(char[][] matrix, int H, int W) {
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
//해당 자리가 구름인 경우
if (matrix[i][j] == 'c') {
System.out.print(0);
}
//구름이 아닌 경우
else {
int count = -1;
//해당 자리 이전을 모두 검사하면서 구름이 나올때 까지 검사
for (int z = j - 1; z >= 0; z--) {
//구름이 등장했다면 해당 간격 출력
if (matrix[i][z] == 'c') {
count = j - z;
break;
}
}
System.out.print(count);
}
// 마지막 열이 아니라면 공백 추가
if (j != W - 1) {
System.out.print(" ");
}
}
System.out.println(); // 줄 바꿈
}
}
public static void main(String[] args) throws IOException {
int H,W;
char[][]matrix;
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st= new StringTokenizer(br.readLine());
//H와 W 입력
H= Integer.parseInt(st.nextToken());
W= Integer.parseInt(st.nextToken());
matrix= new char[H][W];
//maxtrix 입력
for (int i = 0; i < H; i++) {
String line = br.readLine();
for (int j = 0; j < W; j++) {
matrix[i][j] = line.charAt(j);
}
}
ResultPrint(matrix,H,W);
}
}

마무리하며:
처음 풀 때는 각 칸마다 구름이 언제 오는지만 잘 계산하면 될 줄 알았는데, 출력할 때 숫자 뒤에 공백을 무조건 붙였다가 오답 처리가 났다. 알고 보니 문제에서는 줄 끝에 공백이 들어가면 안 되는 형식이었다. 로직은 맞았는데 출력 형식 하나 때문에 틀린 거라 아쉬웠다. 이 문제를 풀 때는 출력 마지막에 공백이 들어가지 않도록 조심해야 하니까, 같은 실수 하지 않도록 꼭 참고하면 좋겠다.
'코딩 테스트' 카테고리의 다른 글
| [백준] 4949 균형잡힌 세상 (JAVA) (1) | 2025.07.11 |
|---|---|
| [백준] 2852 NBA 농구 (JAVA) (7) | 2025.07.10 |
| [백준] 2870 수학숙제 (JAVA) (0) | 2025.07.08 |
| [백준] 4659 비밀번호 발음하기 (JAVA) (1) | 2025.07.06 |
| [백준] 2910 빈도 정렬 (JAVA) (1) | 2025.07.04 |