본문 바로가기
코딩테스트 파이썬/시뮬레이션

10709 기상캐스터

by 백엔드 개발자 2021. 7. 28.

문제

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을 출력한다.

 

 

구름이 인덱스 방향으로 각 열마다 이동하는것을 볼 수 있다.

경우의 수를 잘 따져서 풀었다.

 

입력 및 변수로

1. H,W

2. 구름 입력받을 문자열배열

3. 정답 배열

4.구름이 앞에 있는지 여부 불 변수

5.증가값.

이렇게 설계하고 풀었다.

 

규칙을 보면 처음에 구름이 있으면 0이고, 아예올 가능성이 없으면 -1이다.

그래서 구름을 발견하면 0으로 만들고

구름이 한번도 없으면서 . 일 경우에는 -1,

구름이 앞에 있으면서 .일경우에는 증가값을 갱신시키며 값을 대입했다.

 

유의해야 할게 이게 각 행마다 독립이기 때문에 구름,증가값 변수는 행을 넘어가면  따로 초기화 해주어야 한다.

 

# H , W입력
H,W=map(int,input().split())

cloudArr=[
input() for _ in range(H) ]


ansArr=[ [
0]*W for _ in range(H) ]
isCloud=
False
cnt=1


for i in range(H):
    isCloud=
False
   
cnt=1
   
for j in range(W):
       
#1 isCloud false면서 .일때
       
if isCloud==False and cloudArr[i][j]=='.':
            ansArr[i][j]=-
1
       
#2. 구름일 때
       
if cloudArr[i][j]=='c':
            isCloud=
True
           
cnt=1
       
#3. 앞에 구름이 있을 때 .이면
       
elif isCloud==True and cloudArr[i][j]=='.':
            ansArr[i][j]=cnt
            cnt+=
1

for i in range(H):
   
print(" ".join( map(str, ansArr[i] )   ) )