4014. [모의 SW 역량테스트] 활주로 건설

SW 업무 관련/SW Expert Academy

4014. [모의 SW 역량테스트] 활주로 건설

WillBe_ 2018. 10. 3. 21:48

요건 백준 14890 경사로랑 동일하다. 각각의 세로 가로에 대해 판단을 해주어야 한다.


1. 현재 높이와 다음 칸의 높이가 -1


cnt는 높이가 연속된 배열의 길이이다. 이건 앞으로 가야하는데 높이가 1차이 나는 곳을 위해 경사로를 설치하기 위함이다. 현재 앞칸과 높이가 1이고, cnt가 x보다 길면 다음 칸으로 나아갈 수 있으며, cnt는 초기화된다.



2. 현재 높이와 다음 칸의 높이가 1


현재 높이가 다음 칸보다 1보다 높은 경우, 다음 칸부터 길이 x만큼 평지 인지를 판단해주면 된다. 이때 주의할게 경사로 설치 기준이 만족하면, cnt=-1, j+=(x-1)로 설정을 해주어야한다. j+=x로 할 경우 for문을 거치면서 j++가 되어, j+x 와 j+x+1을 비교해주지 않고 넘어가게 된다. 그리고 j를 x-1만큼 이동을 하였다. 이때 0으로 초기화해주면 경사로가 위치한 자리임에도 cnt++이 되어 cnt가 0이어야 함에도 1이 되어 오답이 발생한다.


3. 현재 높이와 다음칸의 높이가 -1, 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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <stdio.h>
#include <string.h>
 
int main()
{
    int Test_Case;
    scanf("%d"&Test_Case);
 
    for (int T = 1; T <= Test_Case; T++)
    {
        int Total = 0, N, X;
        int map[20][20= {0,};
 
        scanf("%d %d"&N, &X);
 
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
                scanf("%d"&map[i][j]);
 
        int cnt = 0, num = 0, Flag = 0;
 
        for (int i = 0; i < N; i++)
        {
            //가로
            cnt = 0;
            for (int j = 0; j < N - 1; j++)
            {
                cnt++;
                num = map[i][j] - map[i][j + 1];
 
                if (num == 1)
                {
                    Flag = 0;
                    for (int a = 0; a < X; a++)
                    {
                        if (j + 1 + a >= N || map[i][j + 1!= map[i][j + 1 + a])
                        {
                            Flag = 1;
                            break;
                        }
                    }
                    if (Flag)
                        break;
                    j += (X - 1); cnt = 0;
                }
                else if (num == -1)
                {
                    if (cnt >= X)
                        cnt = 0;
                    else
                        break;
                }
                else if (num > 1 || num < -1)
                {
                    break;
                }
                if (j == N - 2)
                {
                    printf("X : %d \n", i);
                    Total++;
                }
            }
            //세로
            cnt = 0;
            for (int j = 0; j < N - 1; j++)
            {
                cnt++;
                num = map[j][i] - map[j + 1][i];
 
                if (num == 1)
                {
                    Flag = 0;
                    for (int a = 0; a < X; a++)
                    {
                        if (j + 1 + a >= N || map[j + 1][i] != map[j + 1 + a][i])
                        {
                            Flag = 1;
                            break;
                        }
                    }
                    if (Flag)
                        break;
                    j += (X - 1); cnt = 0;
                }
                else if (num == -1)
                {
                    if (cnt >= X)
                        cnt = 0;
                    else
                        break;
                }
                else if (num > 1 || num < -1)
                {
                    break;
                }
 
                if (j == N - 2 )
                {
                    printf("Y : %d \n", i);
                    Total++;
                }
            }
        }
 
        printf("#%d %d\n", T, Total);
    }
    return 0;
}
cs