반응형
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWefzFeq5P8DFAUh
DFS로 풀면 시간초과 및 종료 시점에 대한 지정이 힘들다.
규칙을 찾아서 푸는 것이 관건인 문제.
어떤 모양이 주어졌을 때, 그 모양을 만들기 위해서 최소로 뒤집어야 하는 좌표는 i,j에 있어서 해당 열과 행의
검은색의 개수의 합이 홀수인 좌표이다.
따라서 각 열과 행의 검은색 개수를 구하고
이때 i,j 좌표 자체가 검은색이면 행과 열의 개수 합에서 -1을 해줘야 함.
홀수인 좌표의 개수를 카운트해서 출력하면 끝.
#include<iostream>
#include<string.h>
#include<cmath>
using namespace std;
int N;
int mina;
char arr[1000][1000];
int row[1000];
int col[1000];
int main(int argc, char** argv)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int test_case;
int T;
cin >> T;
for (test_case = 1; test_case <= T; ++test_case)
{
cin >> N;
mina = 987654321;
memset(row, 0, sizeof(row));
memset(col, 0, sizeof(col));
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cin >> arr[i][j];
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (arr[i][j] == 'B')
{
row[i]++;
col[j]++;
}
}
}
int result = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
int black;
if (arr[i][j] == 'B')
{
black = row[i] + col[j] - 1;
}
else
{
black = row[i] + col[j];
}
if (black % 2)
{
result++;
}
}
}
cout << "#" << test_case << " " << result << endl;
}
return 0;//정상종료시 반드시 0을 리턴해야합니다.
}
반응형
'Algorithm' 카테고리의 다른 글
5432. 쇠막대기 자르기 (0) | 2020.04.26 |
---|---|
2019 KAKAO BLIND RECRUITMENT실패율 (0) | 2020.04.24 |
백준 2110번 공유기 설치 (0) | 2020.04.23 |
백준 게리맨더링 2 재풀이 (0) | 2020.04.23 |
6719. 성수의 프로그래밍 강좌 시청 (0) | 2020.04.22 |