처음에는 각 column 간의 차이를 위주로 접근하다가, 위에서부터 한 row씩 훑고 내려오면서 연산하는 방식으로 접근을 달리했다.
맨 위 row 부터 순회하면서, 만일 값이 1인 칸을 이미 만난 상태라면 이후 0인 칸을 만날 때마다 값을 더해준다. 만일 다시 값이 1인 칸을 만나면, 해당 값을 정답에 더해주고 0으로 초기화한다.
양 옆이 뚫려 있다고 생각해야 하므로, 다음 row로 내려갈 때 값을 0으로 초기화한다. 이 때 1인 칸을 만났는지 여부를 확인하는 flag(여기서는 isFill)을 false로 초기화 해 준다.
#include <iostream>
#include <vector>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int W, H;
cin>>H>>W;
vector<vector<int>> board(H, vector<int>(W));
int input;
for(int i=0;i<W;i++)
{
cin>>input;
for(int j=0;j<input;j++)
{
board[j][i] = 1;
}
}
int tmp = 0;
int ans = 0;
bool isFill = false;
for(int r=H-1;r>=0;r--)
{
for(int c=0;c<W;c++)
{
if(board[r][c]==0)
{
if(isFill) tmp++;
}
else if(board[r][c]==1)
{
if(isFill)
{
ans+=tmp;
tmp = 0;
}
else{
isFill = true;
}
}
if(c==W-1)
{
isFill = false;
tmp = 0;
}
}
}
cout<<ans;
}
'프로그래밍 > 백준 복기' 카테고리의 다른 글
[Greedy] 백준 4796: 캠핑 (2) | 2024.10.23 |
---|---|
[이분 탐색] 백준 2805: 나무 자르기 (0) | 2024.10.22 |
[BruteForce] 백준 14888: 연산자 끼워넣기 (0) | 2024.06.02 |
[수학] 백준 1629: 곱셈 (0) | 2024.04.04 |
[자료구조] 백준 1655: 가운데를 말해요 (0) | 2024.03.03 |