반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 14890 경사로 본문

백준(Baekjoon) 문제

백준 14890 경사로

huiung 2020. 4. 19. 18:59
반응형

이 문제는 각 행과,열을 길이라고 할 때 지나갈 수 있는 길의 개수를 구하는 문제입니다.

 

길을 지나간다는 것은 높이가 같은경우 통행이 가능하고 만약 높이가 정확히 1차이난다면 문제에 주어진 길이 L만큼의 경사로를 설치 할 수 있습니다. 이 경사로를 배치하면 그 구간은 지나갈 수 있게 됩니다. 이때 이 경사로는 높이가 더 낮은 곳에만 설치 할 수 있습니다.

 

즉 정리하면 각 행과 열을 훑어보면서, 높이가 1차이 나는 순간 높이가 더낮은 바닥이 최소 L이상 존재하는지 확인 해주면 되는 문제입니다.

 

구간을 보면서 현재 연속된 구간의 개수인 curlen을 추가해주며 진행해줍니다. 이때 높이가 1 차이나는 순간을 만났을 때 만약 전에 본 부분이 높이가 낮다면 curlen 이 주어진 길이 L보다 크거나 같은지 확인 해주면 되고 이후 부분이 높이가 더 낮다면 이후 부분을 쭉 훑으며 curlen 보다 크거나 같다면 curlen에 L길이를 빼준뒤 다음 구간을 진행해주면 됩니다.

 

다음은 코드입니다.

 

#include <iostream>
#include <cmath>

using namespace std;

int board[110][110];
int N,L;
int ans;

int sol(int num, int dir) {
    int cur;
    int prev;
    int curlen = 1;
    for(int i = 0; i < N; i++) {
        if(dir==1) cur = board[num][i];
        else cur = board[i][num];

        if(i==0) prev = cur;
        else {
            if(prev == cur) {
                curlen++;
            }
            else if(abs(prev-cur) == 1) {
                if(prev-cur == -1) { //오른쪽이 더 큰 경우
                    if(curlen < L) return 0;
                    curlen = 1; // 다시 1
                    prev = cur;
                }
                else { //왼쪽이 더 큰 경우
                    curlen = 0;
                    prev = cur;
                    while(prev-cur == 0) {
                        curlen++;
                        i++;
                        if(i > N-1) break;

                        if(dir==1) cur = board[num][i];
                        else cur = board[i][num];
                    }
                    i--;

                    if(curlen < L) return 0;
                    else {
                        curlen -= L;
                    }
                }
            }
            else return 0;
        }
    }
    return 1;
}


int main(void) {
    ios_base::sync_with_stdio(false); cin.tie(0);

    cin >> N >> L;

    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
            cin >> board[i][j];

    for(int i = 0; i < N; i++) { //각 행별 확인
        int ret = sol(i, 1);
        ans += ret;

    }

    for(int i = 0; i < N; i++) { //각 열별 확인
        int ret = sol(i, 0);
        ans += ret;
    }

    cout<<ans;
    return 0;
}
반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 15684 사다리 조작  (0) 2020.05.01
백준 15683 감시  (0) 2020.04.20
백준 14500 테트로미노  (0) 2020.04.19
백준 12100 2048(Easy)  (0) 2020.04.18
백준 18809 Gaaaaaaaaaarden  (2) 2020.03.23