알고리즘/백준

[백준/c++] 10709번: 기상캐스터

녕이 2022. 4. 22. 16:42
728x90

 

https://www.acmicpc.net/problem/10709

 

10709번: 기상캐스터

출력은 H 행으로, 각 행에는 공백으로 구분된 W 개의 정수를 출력한다. 출력의 i 번째 행 j 번째 정수 (1 ≦ i ≦ H, 1 ≦ j ≦ W) 는, 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시

www.acmicpc.net

 

1분씩 1km 동쪽으로 이동하고, 각 위치에 구름이 몇 분 후에 뜨는지 출력하면 된다.

처음부터 떠있었으면 0, 구름이 모두 지나가서 없을 때까지 구름이 뜨지 않는다면 -1을 출력하자.

 

2가지 배열을 사용했다.

 

- 몇 분 뒤에 구름이 뜨는지 시간을 저장할 2차원 배열 cloud[][]

- 각 구름의 위치를 저장할 2차원 벡터 vector<pair<int, int>> c;

 

 

입력

- 'c'가 입력되면, cloud [][]에 0을 넣어준다 -> 처음부터 구름이 떠있는 경우이므로.

  구름의 위치를 벡터 c에 넣어준다

- 'c'가 아니면, cloud[][]에 -1을 넣어서 초기화해준다.

 

구현

 

구름이 지도 안에 모두 없다면 종료이므로 구름의 정보를 담은 벡터 c가 비었다면 반복문 종료한다.

시간을 cloud에 넣어줘야 하므로 time 변수로 시간을 체크해준다.

 

- 벡터 c에서 구름들을 차례대로 동쪽으로 이동시켜준다. c [i]. second++

- 만약 이동한 구름이  지도를 나가게 된다면, 이 구름은 벡터에서 삭제해준다(erase())

  이때, 삭제를 하면 뒤의 구름이 삭제된 구름의 인덱스에 위치하게 되는데, 이를 내버려두면 반복문에 의해 다음 구름은 어떠한 일도 수행하지  

  않고 그다음 구름으로 넘어가므로 꼭 반복문의 인덱스 i를 감소시켜준다(i--)

- 이동한 구름이 지도를 나가지 않는다면, 해당 위치에 time 값을 넣어주는데

  이때, 해당 구름 시간 값이 -1인지 확인한다. 처음으로 구름이 뜨게 되는 시간을 넣어야 하므로 중복을 체크해줘야 한다.

 

출력

cloud [][]의 값을 반복문으로 출력해주면 된다.

 

 

#include <iostream>
#include <vector>
using namespace std;

int main(){
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int h, w, cloud[102][102], time=0;
    vector<pair<int, int>> c;
    
    cin >> h >> w;
    
    for(int i=1; i<=h; i++) for(int j=1; j<=w; j++) {
        char clo;
        cin >> clo;
        if(clo == 'c'){
            c.push_back({i, j});
            cloud[i][j] = 0;
        }else{
            cloud[i][j] = -1;
        }
    }
    
    while(!c.empty()){
        time++;
        //동쪽으로 구름들 이동
        for(int i=0; i<c.size(); i++) {
            c[i].second++;
            if(c[i].second > w) {
                c.erase(c.begin() + i); //범위를 넘어서면 삭제하기
                i--;
            }
            else{
                if(cloud[c[i].first][c[i].second] == -1) cloud[c[i].first][c[i].second] = time;
            }
        }
    }
    
    for(int i=1; i<=h; i++){
        for(int j=1; j<=w; j++){
            cout << cloud[i][j] << ' ';
        }
        cout << '\n';
    }
    
    return 0;
}

 

 

 

 

 

728x90