※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 14711번 문제인 타일 뒤집기 (Easy)이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/14711
14711번: 타일 뒤집기 (Easy)
지구이는 신기한 게임판을 가지고 있다. 이 게임판에는 한 면은 검은색, 한 면은 흰색으로 칠해진 타일이 N행 N열으로 배치되어 있다. 각 타일은 제자리에서 뒤집을 수 있는데, 타일 하나를 뒤집
www.acmicpc.net
문제에서 주어진 첫 행은 더 건드리지 않고 시작 게임판에서의 검은 칸만을 눌렀을 때 모든 칸을 흰 칸으로 만드는 검은 칸의 배치를 찾자.
두 번째 행서부터 순서대로 각 행을 살필 때, 이전 행에 검은 칸이 남아있다면 그 검은 칸을 지울 수 있으면서 건드릴 수 있는 칸은 해당 검은 칸의 아래인 현재 행의 칸 뿐이다. 그러므로 그 칸은 검은 칸이 되어야한다.
반대로 같은 열 이전 행의 칸이 흰 색이면 바로 아래 칸을 누를 시 이전 행의 칸이 검은 칸이 되는데, 이 검은 칸을 다시 흰 칸으로 돌려놓을 방법이 없으므로 해당 칸은 흰 칸이어야 한다.
위의 두 경우를 보았을 때, 이전 행의 색 배치가 정해지면 다음 행의 색 배치 또한 정해지는 것을 알 수 있다.
답이 (유일하게) 존재하는 것은 문제에서 보장하고 있으므로, 위의 시뮬레이션을 직접 돌려 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <string>
using namespace std;
int arr[1002][1002];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int slen; string s; cin >> slen >> s; // 흰색이 0
cout << s << '\n';
for (int c = 1; c <= slen; c++) {
if (s[c - 1] == '#') {
arr[1][c - 1] ^= 1, arr[1][c + 1] ^= 1, arr[2][c] ^= 1;
}
}
for (int r = 2; r <= slen; r++) {
for (int c = 1; c <= slen; c++) {
if (arr[r - 1][c]) {
cout << '#';
arr[r][c - 1] ^= 1, arr[r][c + 1] ^= 1, arr[r + 1][c] ^= 1;
}
else cout << '.';
}
cout << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 14699 // C++] 관악산 등산 (0) | 2022.07.03 |
---|---|
[BOJ 14715 // C++] 전생했더니 슬라임 연구자였던 건에 대하여 (Easy) (0) | 2022.07.03 |
[BOJ 14709 // C++] 여우 사인 (0) | 2022.07.01 |
[BOJ 14701 // C++] 셔틀버스 (0) | 2022.06.30 |
[BOJ 1445 // C++] 일요일 아침의 데이트 (0) | 2022.06.29 |