# 본인 풀이
#include<bits/stdc++.h>
using namespace std;
int h,w;
string a[104];
// 분당 오른쪽으로 1칸씩 이동
// 이미 구름이 지나간 지역 -> -1
// 현재 구름이 위치한 지역 -> 0
// 곧 도래할 지역 -> +n
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> h >> w;
int ret[h][w];
for (int i = 0; i < h; i++){
cin >> a[i];
// 구름이 시작된 위치
// 구름이 맨 오른쪽에 위치한다고 가정하면 됨
int start = w;
for (int j = 0; j < w; j++){
if(a[i][j] == 'c'){
start = j;
ret[i][j] = 0;
continue;
}
// 구름보다 오른쪽에 위치한 지역
if(j > start){
ret[i][j] = j - start;
continue;
}
ret[i][j] = -1;
}
}
for (int i = 0; i < h; i++){
for (int j = 0; j < w; j++){
cout << ret[i][j] << " ";
}
cout << "\n";
}
return 0;
}
- 행별로 순회하며 구름 위치를 파악한뒤, 구름이 같은 행 지역 내에서 발견된 경우 그곳을 start 기점으로 잡는다.
- 이후 오른쪽 지역들을 각각 순회하며 떨어진 거리만큼 초기화해준다.
- 만약 한 행에서 구름이 발견되지 않는 경우에 대해서는 애초에 구름 시작지점을 맨 오른쪽으로 잡아서 기본적으로 -1로 초기화되도록 한다.
# 모범 답안
#include<bits/stdc++.h>
using namespace std;
int n, m, a[104][104];
string s;
int main(){
cin >> n >> m;
for (int i = 0; i < n; i++){
cin >> s;
for (int j = 0; j < m; j++){
if(s[j] == '.'){
a[i][j] = -1;
}else{
a[i][j] = 0;
}
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
if(a[i][j] == 0){
int cnt = 1;
while(a[i][j+1] == -1){
a[i][j + 1] = cnt++;
j++;
}
}
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
cout << a[i][j] << " ";
}
cout << "\n";
}
return 0;
}
- 구름이 있는곳을 애초에 0으로 초기화하며 로직을 시작했음.
- 어차피
a
배열을 104 x 104사이즈로 선언했기 때문에j+1
인덱싱을 진행하면 0이 나옴. -> while문으로 구름이 없는 지역들을 순회하며 모두 cnt로 초기화 - 순회할때는 104사이즈만큼 하지 않고 입력되는 n x m 사이즈만큼 진행하니 문제없음