알고리즘 : C++/BaekJoon
백준 10709번 - 기상캐스터
동 노이만
2023. 5. 28. 21:39
https://www.acmicpc.net/problem/10709
10709번: 기상캐스터
출력은 H 행으로, 각 행에는 공백으로 구분된 W 개의 정수를 출력한다. 출력의 i 번째 행 j 번째 정수 (1 ≦ i ≦ H, 1 ≦ j ≦ W) 는, 지금부터 몇 분후에 처음으로 구역 (i, j) 에 구름이 뜨는지를 표시
www.acmicpc.net
풀이 과정
동쪽으로 이동하는 구름이 얼만큼 시간이 흐른 뒤 해당 위치에 도착하는지 좌표마다 출력하는 문제이다. char형으로 입력을 받았다. 그리고 모든 노드를 순회하며 해당 행에서 부터 왼쪽으로 탐색해 cnt를 증가시키며 시간을 계산해 ret배열에 경과된 시간을 입력했다. 만약 구름을 찾지 못했을 경우에는 clouldFlag를 이용해 -1을 입력했다.
느낀 점
이전에는 구름이 제자리에 있는 경우를 따로 분류해서 만들었는데 생각해보면 경과 시간이 0인 것과 같다. 따라서 구름이 해당 위치에 있는지 따로 검사하지 않고 왼쪽으로 검색을 하며 한번에 해당 경우도 찾아내도록 구성했다.
#include<bits/stdc++.h>
using namespace std;
const int MX = 100;
int n, m, ret[MX][MX];
char mp[MX + 4][MX + 4];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
//입력
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> mp[i][j];
}
}
//모든 노드 순회
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
//좌측으로 탐색
int cnt = 0; bool cloudFlag = false;
for (int k = j; k >= 0; k--) {
if (mp[i][k] == 'c') { //구름 발견 시
ret[i][j] = cnt;
cloudFlag = true;
break;
}
cnt++; //소요 시간 증가
}
if (!cloudFlag) ret[i][j] = -1; //경로 내 구름X
}
}
//출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << ret[i][j] << " ";
}
cout << "\n";
}
return 0;
}