[백준/c++] 10709번: 기상캐스터
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;
}