코딩 테스트 연습/백준 silver

[백준] S5. 기상캐스터 (Python)

카누가 좋아요 2023. 6. 18. 20:20

❓ 문제

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)))

 

 

 

🙂 돌아보기

구름을 옮기는 방법에 대해 살짝 생각해야 하는 문제였다.

그리고 '처음' 으로 하늘에 구름이 오는 시간을 기록해야 한다는 문제 조건을 제대로 읽고 넘어가야 한다.