※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts