1+ #include < bits/stdc++.h>
2+
3+ using namespace std ;
4+
5+ // 현재 설치된 구조물이 '가능한' 구조물인지 확인하는 함수
6+ bool possible (vector<vector<int > > answer) {
7+ for (int i = 0 ; i < answer.size (); i++) {
8+ int x = answer[i][0 ];
9+ int y = answer[i][1 ];
10+ int stuff = answer[i][2 ];
11+ if (stuff == 0 ) { // 설치된 것이 '기둥'인 경우
12+ bool check = false ;
13+ // '바닥 위'라면 정상
14+ if (y == 0 ) check = true ;
15+ // '보의 한 쪽 끝 부분 위' 혹은 '다른 기둥 위'라면 정상
16+ for (int j = 0 ; j < answer.size (); j++) {
17+ if (x - 1 == answer[j][0 ] && y == answer[j][1 ] && 1 == answer[j][2 ]) {
18+ check = true ;
19+ }
20+ if (x == answer[j][0 ] && y == answer[j][1 ] && 1 == answer[j][2 ]) {
21+ check = true ;
22+ }
23+ if (x == answer[j][0 ] && y - 1 == answer[j][1 ] && 0 == answer[j][2 ]) {
24+ check = true ;
25+ }
26+ }
27+ if (!check) return false ; // 아니라면 거짓(False) 반환
28+ }
29+ else if (stuff == 1 ) { // 설치된 것이 '보'인 경우
30+ bool check = false ;
31+ bool left = false ;
32+ bool right = false ;
33+ // '한쪽 끝부분이 기둥 위' 혹은 '양쪽 끝부분이 다른 보와 동시에 연결'이라면 정상
34+ for (int j = 0 ; j < answer.size (); j++) {
35+ if (x == answer[j][0 ] && y - 1 == answer[j][1 ] && 0 == answer[j][2 ]) {
36+ check = true ;
37+ }
38+ if (x + 1 == answer[j][0 ] && y - 1 == answer[j][1 ] && 0 == answer[j][2 ]) {
39+ check = true ;
40+ }
41+ if (x - 1 == answer[j][0 ] && y == answer[j][1 ] && 1 == answer[j][2 ]) {
42+ left = true ;
43+ }
44+ if (x + 1 == answer[j][0 ] && y == answer[j][1 ] && 1 == answer[j][2 ]) {
45+ right = true ;
46+ }
47+ }
48+ if (left && right) check = true ;
49+ if (!check) return false ; // 아니라면 거짓(False) 반환
50+ }
51+ }
52+ return true ;
53+ }
54+
55+ vector<vector<int > > solution (int n, vector<vector<int > > build_frame) {
56+ vector<vector<int > > answer;
57+ // 작업(frame)의 개수는 최대 1,000개
58+ for (int i = 0 ; i < build_frame.size (); i++) {
59+ int x = build_frame[i][0 ];
60+ int y = build_frame[i][1 ];
61+ int stuff = build_frame[i][2 ];
62+ int operate = build_frame[i][3 ];
63+ if (operate == 0 ) { // 삭제하는 경우
64+ // 일단 삭제를 해 본 뒤에
65+ int index = 0 ;
66+ for (int j = 0 ; j < answer.size (); j++) {
67+ if (x == answer[j][0 ] && y == answer[j][1 ] && stuff == answer[j][2 ]) {
68+ index = j;
69+ }
70+ }
71+ vector<int > erased = answer[index];
72+ answer.erase (answer.begin () + index);
73+ if (!possible (answer)) { // 가능한 구조물인지 확인
74+ answer.push_back (erased); // 가능한 구조물이 아니라면 다시 설치
75+ }
76+ }
77+ if (operate == 1 ) { // 설치하는 경우
78+ // 일단 설치를 해 본 뒤에
79+ vector<int > inserted;
80+ inserted.push_back (x);
81+ inserted.push_back (y);
82+ inserted.push_back (stuff);
83+ answer.push_back (inserted);
84+ if (!possible (answer)) { // 가능한 구조물인지 확인
85+ answer.pop_back (); // 가능한 구조물이 아니라면 다시 제거
86+ }
87+ }
88+ }
89+ // 정렬된 결과를 반환
90+ sort (answer.begin (), answer.end ());
91+ return answer;
92+ }
0 commit comments