Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- Smilegate
- 카카오
- 투포인터
- 알고리즘
- Union-find
- 중반부
- 1편
- 삼성 #코테 #2020상반기 #c++
- BaekJoon
- 소감
- Algorithm
- 유니온파인드
- 스마일게이트
- LIS #Algorithm #요소추적
- 식단
- 코딩테스트
- 카카오인턴
- 코테
- 백준
- IBK기업은행 #기업은행 #디지털 #직무 #정리
- BFS
- 서버개발캠프
- c++
- 보석쇼핑
Archives
- Today
- Total
짱아의 개발 기록장
2020 KAKAO BLIND RECRUITMENT : 기둥과 보(c++) / 구현 본문
반응형
문제의 핵심은
기둥과 보를 설치하는 것이 아니라 삭제하는 부분이라고 생각합니다.
설치를 할 때는 설치하는 부분만 확인을 하면 되지만, 삭제는 삭제를 한 후 다른 모든 기둥과 보가 규칙을 만족하는 지를 일일히 확인해주어야 합니다.
물론 삭제하는 기둥이나 보의 근처에 있는 기둥과 보만 검사를 하는 방법도 있겠지만?
너무 많다....ㅎㅎ 그래서 그냥 다 검사해보는 방법으로 코드를 구현했습니다.
그래서 삭제 부분은
1) 기둥이나 보를 일단 삭제한다.
3) 그리고 모든 기존에 있던 모든 기둥과 보를 검사하며 그 자리에 있던 기둥과 보를 삭제하고 다시 넣었을 때 규칙을 성립하는 지 확인해주었다. => 모두 규칙을 성립한다? 그럼 그냥 삭제 / 하나라도 규칙 성립 x? 그럼 그냥 넣는다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int wall[102][102][3] = {0, };
int N;
bool add(int x, int y, int a){
if(a==0){ // 기둥
// 바닥 위
if(y==0){
return true;
}
// 보의 한쪽 부분 위
if((x-1>=0 && wall[x-1][y][1]==1) || wall[x][y][1]==1){
return true;
}
// 다른 기둥 위
if(y-1>=0 && wall[x][y-1][0]==1){
return true;
}
}else{ // 보
// 한쪽 끝 부분이 기둥 위
if((y-1>=0 && wall[x][y-1][0]==1) || (wall[x+1][y-1][0]==1 && x+1<=N && y-1>=0)){
return true;
}
// 양쪽 부분이 다른 보와 동시에 연결
if((x-1>=0 && wall[x-1][y][1]==1) && (wall[x+1][y][1]==1 && x+1<=N)){
return true;
}
}
return false;
}
bool remove()
{
for(int i=0; i<=N; i++){
for(int j=0; j<=N; j++){
for(int k=0; k<2; k++){
if(wall[i][j][k]==1){
wall[i][j][k] = 0;
if(!add(i, j, k)){
wall[i][j][k] = 1;
return false;
}
wall[i][j][k] = 1;
}
}
}
}
return true;
}
vector<vector<int>> solution(int n, vector<vector<int>> build_frame) {
vector<vector<int>> answer;
N = n;
for(int i=0; i<build_frame.size(); i++){
int x = build_frame[i][0];
int y = build_frame[i][1];
int a = build_frame[i][2];
int b = build_frame[i][3];
if(b==0){
wall[x][y][a] = 0;
if(!remove()){
wall[x][y][a] = 1;
}
}else{
if(add(x, y, a)){
wall[x][y][a] = 1;
}
}
}
for(int i=0; i<=N; i++){
for(int j=0; j<=N; j++){
for(int k=0; k<2; k++){
if(wall[i][j][k]==1){
vector<int> temp;
temp.push_back(i);
temp.push_back(j);
temp.push_back(k);
answer.push_back(temp);
}
}
}
}
return answer;
}
|
cs |
반응형
'Algorithm > 카카오 기출' 카테고리의 다른 글
2019 카카오 개발자 겨울 인턴십 : 튜플(c++) / 구현 (0) | 2021.03.14 |
---|---|
2018 KAKAO BLIND RECRUITMENT : 프렌즈4 블록(c++) / 구현 (0) | 2021.03.10 |
2018 KAKAO BLIND RECRUITMENT : 캐시(c++) (0) | 2021.03.09 |
2021 KAKAO BLIND RECRUITMENT : 합승 택시 요금(c++) / 플로이드 와샬 (0) | 2021.03.09 |
2021 KAKAO BLIND RECRUITMENT : 신규 아이디 추천(c++) (0) | 2021.03.08 |
Comments