알고리즘 문제/[프로그래머스]

[프로그래머스] 기둥과 보 설치

latter2005 2021. 3. 14. 23:19

2020 카카오 블라인드 채용 코딩 테스트 문제입니다.

 

코딩테스트 연습 - 기둥과 보 설치

5 [[1,0,0,1],[1,1,1,1],[2,1,0,1],[2,2,1,1],[5,0,0,1],[5,1,0,1],[4,2,1,1],[3,2,1,1]] [[1,0,0],[1,1,1],[2,1,0],[2,2,1],[3,2,1],[4,2,1],[5,0,0],[5,1,0]] 5 [[0,0,0,1],[2,0,0,1],[4,0,0,1],[0,1,1,1],[1,1,1,1],[2,1,1,1],[3,1,1,1],[2,0,0,0],[1,1,1,0],[2,2,0,1]] [[

programmers.co.kr

문제 확인

 

단순 구현 문제입니다.

 

풀이

 

기둥, 보가 설치된 것을 확인하기 위해 ary[101][101][2] 로 선언합니다. 각 인덱스는 x, y, 0:기둥, 1:보 를 의미합니다.

배열 인덱스의 의미

문제에서 주어진 조건은 다음과 같습니다.

  • 기둥 : 바닥인 경우, 기둥 아래의 오른쪽, 왼쪽 중에 보가 있는 경우, 아래에 기둥이 있는 경우
  • 보 : 양쪽 끝 중 하나 이상의 기둥이 있는 경우, 양쪽 모두 보로 연결되어 있는 경우

 

설치하는 경우 문제에서 주어진 조건을 만족하면 따로 예외처리 없이 설치하면 됩니다.

 

삭제 시 주변의 기둥, 보 모두 조건이 맞는 경우에만 삭제할 수 있으므로 연결되어 조건에 영향을 미치는 보와 기둥을 고려해야 합니다.

왼: 보 삭제, 오: 기둥 삭제

 

조건에 맞춰 진행한 후 문제에 따라 좌표를 기준으로 정렬하여 반환합니다.

 

코드

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
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
bool check_row(bool ary[101][101][2], int x, int y) {//보 검사
    if (!x) return false;//보는 바닥에 있을 수 없음
    if (ary[x - 1][y][0|| ary[x - 1][y + 1][0])//기둥 위
        return true;
    if (0 < y && ary[x][y - 1][1&& ary[x][y + 1][1])//양 끝이 보
        return true;
    return false;
}
bool check_col(bool ary[101][101][2], int x, int y) {//기둥 검사
    if (!x)//바닥
        return true;
    if (ary[x - 1][y][0])//기둥 위
        return true;
    if ((0 < y && ary[x][y - 1][1]) || ary[x][y][1])//보 위
        return true;
    return false;
}
 
vector<vector<int>> solution(int n, vector<vector<int>> build_frame) {
    vector<vector<int>> answer;
    bool ary[101][101][2= { 0 };// 1 : 보, 0 : 기둥
    for (auto &t : build_frame) {
        if (t[2]) {//보
            if (t[3]) {//설치
                if (check_row(ary, t[1], t[0]))
                    ary[t[1]][t[0]][1= 1;
            }
            else {//삭제
                ary[t[1]][t[0]][1= 0;
                if (0 < t[0&& ary[t[1]][t[0- 1][1&& !check_row(ary, t[1], t[0- 1))
                    ary[t[1]][t[0]][1= 1;
                else if (ary[t[1]][t[0]][0&& !check_col(ary, t[1], t[0]))
                    ary[t[1]][t[0]][1= 1;
                else if (ary[t[1]][t[0+ 1][0&& !check_col(ary, t[1], t[0+ 1))
                    ary[t[1]][t[0]][1= 1;
                else if (ary[t[1]][t[0+ 1][1&& !check_row(ary, t[1], t[0+ 1))
                    ary[t[1]][t[0]][1= 1;
                else if (t[1&& ary[t[1- 1][t[0]][0&& !check_col(ary, t[1- 1, t[0]))
                    ary[t[1]][t[0]][1= 1;
                else if (t[1&& ary[t[1- 1][t[0+ 1][0&& !check_col(ary, t[1- 1, t[0+ 1))
                    ary[t[1]][t[0]][1= 1;
            }
        }
        else {//기둥
            if (t[3]) {//설치
                if (check_col(ary, t[1], t[0]))
                    ary[t[1]][t[0]][0= 1;
            }
            else {//삭제
                ary[t[1]][t[0]][0= 0;
                if (ary[t[1]][t[0]][1&& !check_row(ary, t[1], t[0]))
                    ary[t[1]][t[0]][0= 1;
                else if (0 < t[0&& ary[t[1]][t[0- 1][1&& !check_row(ary, t[1], t[0- 1))
                    ary[t[1]][t[0]][0= 1;
                else if (t[1&& ary[t[1- 1][t[0]][0&& !check_col(ary, t[1- 1, t[0]))
                    ary[t[1]][t[0]][0= 1;
                else if (0 < t[0&& ary[t[1+ 1][t[0- 1][1&& !check_row(ary, t[1+ 1, t[0- 1))
                    ary[t[1]][t[0]][0= 1;
                else if (ary[t[1+ 1][t[0]][1&& !check_row(ary, t[1+ 1, t[0]))
                    ary[t[1]][t[0]][0= 1;
                else if (ary[t[1+ 1][t[0]][0&& !check_col(ary, t[1+ 1, t[0]))
                    ary[t[1]][t[0]][0= 1;
            }
        }
    }
 
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= n; j++) {
            if (ary[i][j][0]) answer.push_back({ j, i, 0 });
            if (ary[i][j][1]) answer.push_back({ j, i, 1 });
        }
    }
    sort(answer.begin(), answer.end());
    return answer;
}
int main() {
    int n = 5;
    vector < vector<int>> t= { {0,0,0,1},{2,0,0,1},{4,0,0,1},{0,1,1,1},{1,1,1,1},{2,1,1,1},{3,1,1,1},{2,0,0,0},{1,1,1,0},{2,2,0,1} };
    auto res = solution(n, t);
 
}
cs

정확성 테스트

테스트 1 통과 (0.03ms, 3.96MB)
테스트 2 통과 (0.05ms, 3.97MB)
테스트 3 통과 (0.03ms, 3.91MB)
테스트 4 통과 (0.05ms, 3.95MB)
테스트 5 통과 (0.05ms, 3.93MB)
테스트 6 통과 (0.05ms, 3.93MB)
테스트 7 통과 (0.03ms, 3.96MB)
테스트 8 통과 (0.04ms, 3.96MB)
테스트 9 통과 (0.04ms, 3.85MB)
테스트 10 통과 (0.42ms, 4.17MB)
테스트 11 통과 (0.80ms, 4.34MB)
테스트 12 통과 (0.40ms, 4MB)
테스트 13 통과 (0.76ms, 4.45MB)
테스트 14 통과 (0.39ms, 4.07MB)
테스트 15 통과 (0.82ms, 4.59MB)
테스트 16 통과 (0.41ms, 4MB)
테스트 17 통과 (0.78ms, 4.58MB)
테스트 18 통과 (0.50ms, 4.23MB)
테스트 19 통과 (0.53ms, 4.33MB)
테스트 20 통과 (0.53ms, 4.28MB)
테스트 21 통과 (0.48ms, 4.15MB)
테스트 22 통과 (0.47ms, 4.16MB)
테스트 23 통과 (0.50ms, 4.31MB)

채점 결과

정확성: 100.0

합계: 100.0 / 100.0

반응형