
https://www.acmicpc.net/problem/10709
문제
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을 출력한다.
풀이
# 입력 받기
H, W = map(int, input().split())
sky = [list(input()) for _ in range(H)]
# 구름이 지나가지 않으면 -1을 출력하므로 -1로 초기화
ans = [[-1] * W for _ in range(H)]
for i in range(W): # 제일 왼쪽 구름이 제일 오른쪽에 도달하기까지 반복
for j in range(W - i): # 확인 할 열 범위
for k in range(H): # 모든 행에 대해 확인
if sky[k][j] == 'c' and ans[k][j + i] == -1:
ans[k][j + i] = i
for i in range(H):
print(*ans[i])
내가 생각한 풀이 방법은 이러하다
[i = 0일 때]
전체 범위를 보며 계산

[i = 1일 때]
이미 구름들이 오른쪽으로 한 칸씩 이동한 상태이므로,
가장 오른쪽 열은 이미 범위에서 나간 상태이다. 따라서 W-1까지의 열만 확인하고,
임의의 X에 대해 X-1열이 실제로는 X열에 있다고 가정한다.

[i = 2일 때]
마찬가지로 위 사진에서 또 구름들이 오른쪽으로 한 칸식 이동했으므로, 더 좁은 범위를 확인하며
빨간 네모박스 안의 가장 오른쪽 열이 W열이라고 생각하며 계산한다. (임의의 X에 대해 X-2열이 실제로는 X열에 있다고 가정)

'Coding Test > Problems' 카테고리의 다른 글
| [BOJ | Python] 13301번: 타일 장식물 (2) | 2025.07.30 |
|---|---|
| [BOJ | Python] 1931번: 회의실 배정 (1) | 2025.07.25 |
| [BOJ | Python] 11508번: 2+1 세일 (0) | 2025.07.24 |
| [BOJ | Python] 17952번: 과제는 끝나지 않아! (2) | 2025.07.23 |
| [BOJ | Python] 9237번: 이장님 초대 (0) | 2025.07.23 |