모든 행과 열에 1명 이상의 경비원을 배치한다.
채워야 할 가로의 수를 R, 세로의 수 C라 한다면 min(R, C) 만큼의 경비원은 겹치는 것이 최소이다. (1명으로 2개의 겹치는 공간을 해결하는 것이 불필요한 경비원을 줄이기 때문)
그럼 위의 경비원으로 min(R, C) 만큼 채웠고, 남은 빈 칸(또는 줄)을 채우는 것이 문제인데, 어딜 가건 이미 줄(또는 칸)을 다 채웠기때문에 남은 빈 칸(또는 줄)에 아무렇게나 채우면 된다.
답은 R+C-min(R, C)
데이터 만드는 게 오래걸려서 파이선으로 만들어봤다.
랜덤 데이터 생성 소스 첨부
import random
N, M = random.randrange(1,25), random.randrange(1,25)
print N, M
for _ in range(N):
s = ""
for _ in range(M):
s += "1" if random.randrange(1,10)==1 else "."
print s
#include <cstdio>
#include <algorithm>
int main(){
int i, j, n, m;
scanf("%d %d ", &n, &m);
char s[50][51];
for(i=0; i<n; ++i) scanf("%s ", s[i]);
int r=0, c=0;
for(i=0; i<n; ++i){
bool space = true;
for(j=0; j<m && space; ++j) space &= s[i][j]=='.';
r += space;
}
for(i=0; i<m; ++i){
bool space = true;
for(j=0; j<n && space; ++j) space &= s[j][i]=='.';
c += space;
}
printf("%d", r+c-std::min(r,c));
return 0;
}
댓글 없음:
댓글 쓰기