펭로그

[C++] 삼성 SDS KOITP 마지막생존자 본문

Study/PS(Algorithm)

[C++] 삼성 SDS KOITP 마지막생존자

노랑펭귄 2018. 7. 19. 09:56

문제링크 : https://koitp.org/problem/SDS_TEST_SURVIVOR


[삼성 SDS 대학생 알고리즘 특강 사전 테스트 A Type 2번 문제]

모든 배열을 하나 하나 탐색하여 풀었다. 배열의 각 원소를 중심으로 3*3 내에 불모지가 없고 물, 산, 초원이 모두 있는지를 구하면 된다.

4중 for문이라 코드가 조금 지저분하긴하다.

맵의 가장자리에 도달했을 경우의 예외 처리를 위하여 if(i==0 && a==-1) continue; 같은 구문을 4번이나 넣었는데....

사실 맵의 크기를 상하좌우로 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
// KOITP_SDS_Atype_02
#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    // freopen("../input.txt", "r", stdin);
    int T;
    cin >> T;
 
    for (int t = 0; t < T; t++) {
        int N;
        cin >> N;
        int result = 0;
 
        vector<vector<int>> map(N, vector<int>(N));
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
                cin >> map[i][j];
 
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if(map[i][j] == 0)
                    continue;
                else {
                    bool bmj = false;
                    bool mul = false;
                    bool san = false;
                    bool cho = false;
                    for (int a = -1; a <= 1; a++) {
                        for (int b = -1; b <= 1; b++) {
                            if(i==0 && a==-1)
                                continue;
                            if(i==N-1 && a==1)
                                continue;
                            if(j==0 && b==-1)
                                continue;
                            if(j==N-1 && b==1)
                                continue;
                            switch (map[i + a][j + b]) {
                                case 0:
                                    bmj = true;
                                    break;
                                case 1:
                                    mul = true;
                                    break;
                                case 2:
                                    san = true;
                                    break;
                                case 3:
                                    cho = true;
                                    break;
                            }
                        }
                    }
                    if (!bmj && mul && san && cho)
                        result++;
                }
            }
        }
        cout << "#" << t + 1 << " " << result << "\n";
    }
    return 0;
}
cs


Comments