※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2115번 문제인 갤러리이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2115
대충 쓰면, 각 "일자벽"에 각각 최대한 많은 그림을 걸면 문제가 해결될 것임을 쉽게 알 수 있다. 이는 각각의 일자벽의 길이를 알면 계산할 수 있는데, 이 길이를 어떻게 편하게 계산할 수 있을까?
각 일자벽은 (흰칸, 회색칸)의 두 칸의 행방향 나열이 열방향으로 연속으로 있는 형태, 또는 (회색칸, 흰칸)의 같은 방식의 나열로 앞과 같은 방식으로 있는 형태, 또는 앞의 나열방식을 행과 열을 바꾼 형태의 총 네 가지 중 하나에 속한다. 이를 이용하면 아래의 코드와 같이 간단하게 갤러리의 각각의 일자벽의 길이에 한 번씩 접근해 문제를 편하게 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int R, C, ans;
char board[1000][1000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> R >> C;
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
cin >> board[r][c];
}
}
for (int r = 0; r + 1 < R; r++) {
int combo = 1;
for (int c = 1; c < C; c++) {
if (board[r][c - 1] == board[r][c] && board[r + 1][c - 1] == board[r + 1][c]) combo++;
else {
if (board[r][c - 1] != board[r + 1][c - 1]) ans += combo / 2;
combo = 1;
}
}
}
for (int c = 0; c + 1 < C; c++) {
int combo = 1;
for (int r = 1; r < R; r++) {
if (board[r - 1][c] == board[r][c] && board[r - 1][c + 1] == board[r][c + 1]) combo++;
else {
if (board[r - 1][c] != board[r - 1][c + 1]) ans += combo / 2;
combo = 1;
}
}
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 19666 // C++] Cryptography (0) | 2024.08.10 |
---|---|
[BOJ 13346 // C+] Hamming Ellipses (0) | 2024.08.09 |
[BOJ 30630 // C++] 직각삼각형의 동생은? (0) | 2024.08.07 |
[BOJ 7873 // C++] Decision (0) | 2024.08.06 |
[BOJ 12181 // C++] Googlander (Large) (0) | 2024.08.05 |