[백준] S5. 기상캐스터 (Python)
❓ 문제
https://www.acmicpc.net/problem/10709
10709번: 기상캐스터
출력은 H 행으로, 각 행에는 공백으로 구분된 W 개의 정수를 출력한다. 출력의 i 번째 행 j 번째 정수 (1 ≦ i ≦ H, 1 ≦ j ≦ W) 는, 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시
www.acmicpc.net
💡 해결하기
기본적으로 이차원 리스트를 이용해서 풀어야 하는 문제였다.
1️⃣
입력 첫 줄에 주어지는 숫자는 각각 구역의 h(높이), w(너비)이다. 이것은 각각 행과 열에 대응된다는 것을 헷갈리지 않고 기억해야 한다.
2️⃣
입력 2번째 줄부터 주어지는 구름의 상태(위치) 정보를 담는 리스트(state 리스트)와 몇 분 후에 구름이 뜨는지를 표시할 리스트(answer 리스트)를 따로 만든다. 둘 다 크기는 h X w로 동일하다.
➡️ state 리스트는 어떤 위치에 구름이 있는지를 확인하고 후에 구름을 한칸씩 옮길 때 사용할 리스트
➡️ answer 리스트는 초깃값은 모두 -2로 하여 구름이 지나가는 구역에만 현재까지 지나간 분을 기록하는 용도
분을 기록할 때, state 리스트와 answer 리스트에서의 위치가 동일해야 한다.
또, 구름이 여러 번 뜬 자리는 처음으로 구름이 뜬 시간으로 기록해야 한다.
3️⃣
구름 탐색 시, 한 행 탐색이 끝날 때마다 동쪽으로 한 칸씩 구름을 옮겨준다. 외부에서 새로 들어오는 구름은 없으므로 새로 들어오는 것은 항상 '.'이다.
➡️ 구름을 옮길 때에는 각 행의 마지막 요소를 pop하고 0번 인덱스에 '.'를 삽입하는 형태로 코드를 작성했다.
이렇게 하면 h X w 구역을 한 번 다 돌면 구름이 한칸씩 오른쪽으로 옮겨져 있는 상태가 된다.
이때 지나간 시간을 1분 증가시켜 준다.
이렇게 한 세트가 끝날 때마다 state 리스트에 'c'(구름)이 있는지를 확인하고 있다면 구름의 위치에 분을 기록하는 작업을 다시 하고 없다면 answer 리스트에 있는 -2를 -1로 모두 바꾸어 주면 된다.
구름이 없어졌음에도 -2를 유지하고 있다는 것은 그 자리에는 구름이 뜨지 않았다는 뜻이기 때문이다.
💻 Python으로 코드 작성하기
h, w = map(int, input().split()) # 행의 수, 열의 수
state = [list(item for item in input()) for _ in range(h)] # 입력으로 주어지는 구름의 상태 (공백이 없이 주어진다.)
answer = [[-2] * w for _ in range(h)]
passed_time = 0 # 지나간 시간(분)
while True:
for i in range(h): # i: 행
for j in range(w): # w: 열
if state[i][j] == 'c' and answer[i][j] == -2: # 해당 자리에 구름이 있고 이전에 구름이 지나간 적이 없는 자리라면
answer[i][j] = passed_time # answer의 해당 자리에 지나간 시간을 기록해 줌.
# 하나의 행이 끝나면 그 행에서의 구름을 오른쪽(동쪽)으로 한칸씩 이동해줌. 외부에서 구름이 들어오는 경우는 없기 때문에 새로 들어오는 것은 '.'이다.
state[i].pop()
state[i].insert(0, '.')
passed_time += 1 # 모두 한칸씩 이동이 끝나면 지나간 시간도 1 추가해줌.
for s in state: # state에 더 이상 구름이 없는지 확인
if 'c' in s: # 아직 구름이 남아 있다면
break # 멈추고 다시 while문으로 돌아가기
else: # 구름이 남아 있지 않은 경우
for i in range(h):
for j in range(w):
if answer[i][j] == -2: # answer에 남아 있는 -2인 부분을
answer[i][j] = -1 # -1로 바꿈.
break # 그 후 while문 종료
for item in answer:
print(' '.join(map(str, item)))
🙂 돌아보기
구름을 옮기는 방법에 대해 살짝 생각해야 하는 문제였다.
그리고 '처음' 으로 하늘에 구름이 오는 시간을 기록해야 한다는 문제 조건을 제대로 읽고 넘어가야 한다.