본문 바로가기

알고리즘/프로그래머스

[2020 KAKAO BLIND RECRUITMENT] 기둥과 보 설치(Java, 간단한코드)

## 접근


1. 문제에서 준 조건 두 가지를 이용한다.

  • 기둥은 바닥 위에 있거나 보의 한쪽 끝 부분 위에 있거나, 또는 다른 기둥 위에 있어야 합니다.
  • 보는 한쪽 끝 부분이 기둥 위에 있거나, 또는 양쪽 끝 부분이 다른 보와 동시에 연결되어 있어야 합니다.

2. 문제에서 제거 및 추가에 대해서, 특정한 맵에 반영하고 위의 조건 두 가지를 만족하는지 확인한다.

 

 

 

 

## 시행착오


 1. 맵을 2차원 배열이 아닌, 기둥과 보를 각각 마크할 수 있는 3차원 배열을 해야한다. 왜냐면, 같은 위치에(x, y) 보와 배열이 설치될 수 있다.

 

 

2. if문과 else문 사용 시, 주의해야 한다. continue, break 사용 시에 주의해야 한다. 이것때문에 계속 틀렸었다.

 

 

 

 

## 해설코드


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
import java.util.*;
import java.io.*;
import java.lang.*;
 
class Solution {
    class Item{
        int x, y, a;
        Item(int x, int y, int a){
            this.x = x;
            this.y = y;
            this.a = a;
        }
    }
    
    boolean arrCheck(int[][][] map, int n){
        boolean result = true;  
            
        for(int i = 0; i < map.length; i++){
            for(int j = 0; j < map[i].length; j++){
                if(map[i][j][0== 1){
                    if(j == 0);
                    else if(i - 1 >= 0 && map[i - 1][j][1== 1);
                    else if(map[i][j][1== 1);
                    else if(j - 1 >= 0 && map[i][j - 1][0== 1);
                    else return false;
                }
                
                if(map[i][j][1== 1){
                    if(j - 1 >= 0 && map[i][j - 1][0== 1);
                    else if(i + 1 <= n && j - 1 >= 0 && map[i + 1][j - 1][0== 1);
                    else if(i - 1 >= 0 && i + 1 <= n && map[i - 1][j][1== 1 && map[i + 1][j][1== 1);
                    else return false;
                }
            }
        }
        
        return result;
    }
    
    public int[][] solution(int n, int[][] build_frame) {
        int[][] answer;
        int[][][] map = new int[n + 1][n + 1][2];
        ArrayList<Item> aList = new ArrayList<>();
        
        for(int i = 0; i < map.length; i++){
            for(int j = 0; j < map[i].length; j++){
                for(int k = 0; k < map[i][j].length; k++){
                    map[i][j][k] = 0;
                }
            }
        }
        
        for(int i = 0; i < build_frame.length; 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 == 1){
                map[x][y][a] = 1;
                if(arrCheck(map, n) == false) map[x][y][a] = 0;
            }
            else{
                map[x][y][a] = 0;
                if(arrCheck(map, n) == false) map[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(map[i][j][k] == 1)
                        aList.add(new Item(i, j, k));
                }
            }
        }
 
        answer = new int[aList.size()][3];
        for(int i = 0; i < aList.size(); i++){
            Item item = aList.get(i);
            answer[i][0= item.x;
            answer[i][1= item.y;
            answer[i][2= item.a;    
        }
        
        return answer;
    }
}