※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25275번 문제인 Bar Classification이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25275
25275번: Bar Classification
You are taking a course on machine learning at your university, and as homework you have been tasked with writing a program that can tell vertical bars from horizontal bars in images. To generate some training data, you use the following method. First, tak
www.acmicpc.net
어떤 한 행이 1로 이루어진 행이었다면 (그 행의 0 개수) + (배열의 다른 곳에 있는 1 개수)의 칸을 다시 flip하여 원상복구할 수 있어야 한다. 위의 값이 N 이하이면 그 행이 원래 처음 주어진 이미지였을 가능성이 존재한다. "배열의 다른 곳에 있는 1 개수"는 전체 1 개수를 미리 세둔다면 "그 행의 1개수"를 이용해 낮은 시간복잡도로 편하게 계산할 수 있다.
열 또한 위와 같은 논리로 접근해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
int N;
string board[1000];
int cnt, rcnt[1000], ccnt[1000];
int main() {
ios::sync_with_stdio(0);
cin.tie();
cin >> N;
for (int r = 0; r < N; r++) cin >> board[r];
for (int r = 0; r < N; r++) {
for (int c = 0; c < N; c++) {
if (board[r][c] == '1') rcnt[r]++, ccnt[c]++, cnt++;
}
}
bool chk1 = 0, chk2 = 0;
for (int r = 0; r < N; r++) {
if ((N - rcnt[r]) + (cnt - rcnt[r]) <= N) chk1 = 1;
}
for (int c = 0; c < N; c++) {
if ((N - ccnt[c]) + (cnt - ccnt[c]) <= N) chk2 = 1;
}
if (chk1 && chk2) cout << '+';
else if (chk1) cout << '-';
else cout << '|';
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 9536 // C++] 여우는 어떻게 울지? (0) | 2023.02.21 |
---|---|
[BOJ 2704 // C++] 이진법 시계 (0) | 2023.02.21 |
[BOJ 9784 // C++] Boiled Eggs (0) | 2023.02.20 |
[BOJ 11605 // C++] Magic Trick (0) | 2023.02.20 |
[BOJ 27467 // C++] 수학 퀴즈 (0) | 2023.02.20 |