짱아의 개발 기록장

[Algorithm] 삼성전자 코딩테스트 - 경사로(c++) 본문

Algorithm/삼성 sw 역량테스트 기출

[Algorithm] 삼성전자 코딩테스트 - 경사로(c++)

jungahshin 2020. 9. 24. 16:14
반응형

행과 열을 기준으로 각각 구현하면 된다.

행을 기준으로 설명을 해보겠다.

1) 열마다 탐색하며 높이의 차이가 1만큼 나는 곳에 L길이의 경사로를 설치할 수 있는지 확인한다.

2) 경사로를 설치할 수 없으면 총 길의 개수에서 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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// 경사로
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
 
int ans, n, l;
int area[101][101= {0, };
 
void check()
{
    // 행 기준
    for(int i=0; i<n; i++){
        int visited[101= {0, };
        bool check = true;
        for(int j=0; j<n-1; j++){
            // 내려감
            if((area[i][j]-area[i][j+1])==1){
                if((j+1+l)>n){
                    check = false;
                    break;
                }
 
                int num = 0;
                for(int k=j+1; k<j+1+l; k++){
                    if(area[i][j+1]==area[i][k] && !visited[k]){
                        visited[k] = 1;
                        num++;
                    }
                }
 
                if(num!=l){
                    check = false;
                }
            }else if((area[i][j]-area[i][j+1])==-1){ // 올라감
                if((j+1-l)<0){
                    check = false;
                    break;
                }
 
                int num = 0;
                for(int k=j+1-l; k<j+1; k++){
                    if(area[i][j]==area[i][k] && !visited[k]){
                        visited[k] = 1;
                        num++;
                    }
                }
 
                if(num!=l){
                    check = false;
                }
            }else if(abs(area[i][j]-area[i][j+1])>=2){
                check = false;
            }
        }
        if(check==false){
            ans--;
        }
    }
 
    // 열 기준
    for(int i=0; i<n; i++){
        int visited[101= {0, };
        bool check = true;
        for(int j=0; j<n-1; j++){
            if((area[j][i]-area[j+1][i])==1){
                if((j+1+l)>n){
                    check = false;
                    break;
                }
 
                int num = 0;
                for(int k=j+1; k<j+1+l; k++){
                    if(area[j+1][i]==area[k][i] && !visited[k]){
                        visited[k] = 1;
                        num++;
                    }
                }
 
                if(num!=l){
                    check = false;
                }
            }else if((area[j][i]-area[j+1][i])==-1){
                if((j+1-l)<0){
                    check = false;
                    break;
                }
 
                int num = 0;
                for(int k=j+1-l; k<j+1; k++){
                    if(area[j][i]==area[k][i] && !visited[k]){
                        visited[k] = 1;
                        num++;
                    }
                }
 
                if(num!=l){
                    check = false;
                }
            }else if(abs(area[j][i]-area[j+1][i])>=2){
                check = false;
            }
        }
        if(check==false){
            ans--;
        }
    }
}
 
int main()
{
    cin>>n>>l;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin>>area[i][j];
        }
    }
 
    ans = 2*n;
 
    check();
    cout<<ans<<"\n";
 
    return 0;
}
cs

 

문제 첨부

www.acmicpc.net/problem/14890

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

반응형
Comments