문제 URL:
1236번: 성 지키기
첫째 줄에 성의 세로 크기 N과 가로 크기 M이 주어진다. N과 M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 성의 상태가 주어진다. 성의 상태는 .은 빈칸, X는 경비원이 있는 칸이다
www.acmicpc.net
다음 문제는 모든 행과 모든 열에 한 명 이상의 경비원이 있다고 할 때,
몇 명의 경비원을 최소로 추가해야 하는지 구하는 프로그램이다.
이 문제는 경비원(X)이 없는 행과 열의 개수를 각각 세어 행과 열 중 더 큰 값을 출력하면 된다.
위 내용을 다음과 같이 구현하였다.
- 한 행을 문자열로 입력받고 그 행에 X가 있는지 find() 함수를 통해 확인
- 만약 X가 존재하지 않는다면 rowCount변수를 1 증가시켜준다.
만약 X가 존재한다면 X와 같은 위치에 존재하는 벡터 인덱스에 1을 대입한다. - 위 과정을 마지막 행까지 반복한 뒤 벡터의 요소가 0일 때(=한 열에 X가 존재하지 않을 때) colCount변수를 1 증가시켜준다.
- 이후 rowCount와 colCount 값 중 더 큰 값을 출력
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
string s;
vector<int> v(m);
int rowCount = 0, colCount = 0;
for (int i = 0; i < n; i++)
{
int c = 0;
cin >> s;
if (s.find("X") == string::npos)
rowCount++;
else
while (s.find("X", c) != string::npos)
{
c = s.find("X", c);
v[c] = 1;
if (c < s.size())
c++;
else if (c == s.size())
break;
}
}
for (int i = 0; i < v.size(); i++)
{
if (v[i] == 0)
colCount++;
}
if (rowCount > colCount)
cout << rowCount;
else
cout << colCount;
}