코딩공작소

[백준]경사로(두번) 본문

알고리즘/시뮬레이션

[백준]경사로(두번)

안잡아모찌 2019. 9. 4. 14:27

https://www.acmicpc.net/problem/14890

 

14890번: 경사로

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

www.acmicpc.net

시뮬...  https://rebas.kr/788님 참고

다음계단과 현재계단을 비교하며 1계단 차이가 나야한다. 

오르막길, 내리막길 두가지 상황이 있고 처음에는 오르막길을 만났을 때 뒤로 L칸 탐색, 내리막길을 만났을때 앞으로 L칸 탐색을 진행했었다.

하지만 누적해오면서 진행을 해주면 뒤로 탐색을 하지 않아도 된다.

내리막길 만큼의 L를 음수로 바까주고 cnt++을 해주다 보면 0이될 때 내리막길을 놓은것이 된다.

L가 음수일 때 끝나거나 다른 상황을 만난다면 도중에 새로운 경사로를 놓는것이므로 실패.

 

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
#include <iostream>
using namespace std;
 
int N, L, ans = 0;
int map[100][100];
 
void slope(int i, int c) {
    int cnt = 1;
    for (int j = 0; j < N - 1; j++) {
        int d = c == 1 ? map[i][j + 1- map[i][j] : map[j + 1][i] - map[j][i]; //행 , 열 구분
        if (d == 0) cnt++//같은 경우
        else if (d == 1 && cnt >= L) cnt = 1//오르막길
        else if (d == -1 && cnt >= 0) cnt = -+ 1//내리막길
        else return;
    }
    if (cnt >= 0) ans++;
}
 
void solve() {
    for (int i = 0; i < N; i++) {
        slope(i,0);
        slope(i,1);
    }
}
 
int main()
{
    cin >> N >> L;
    for (int i = 0; i < N; i++for (int j = 0; j < N; j++cin >> map[i][j];
 
    solve();
    printf("%d\n", ans);
    return 0;
}
cs

'알고리즘 > 시뮬레이션' 카테고리의 다른 글

[백준]색종이  (0) 2019.09.14
[백준]톱니바퀴(2)  (0) 2019.09.05
[SWEA]무선충전  (0) 2019.09.01
[백준]미로만들기  (1) 2019.08.23
[SWEA]미생물격리  (0) 2019.08.17