티스토리 뷰

알고리즘/백준(BOJ)

백준 - 14890 경사로

시나모온 2020. 9. 11. 16:20

문제 링크입니다 : www.acmicpc.net/problem/14890

 

14890번: 경사로

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

www.acmicpc.net

 

구현문제였다.

 

 

 

 

 

 

#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int N, L;
vector<vector<int>> board;
int cnt = 0;

bool canInstallRoad(vector<pair<int, bool>>& spot) {

    vector<bool> installed(board.size(), false);

    for(int i = 0; i < spot.size(); i++) {
        int loc = spot[i].first;
        bool isRight = spot[i].second;

        if(isRight) {
            if(loc + L - 1 >= N) return false;
            for(int j = 0; j < L; j++) {
                if(installed[loc + j]) return false;
                installed[loc + j] = true;
            }
        } else {
            if(loc - L + 1 < 0) return false;
            for(int j = 0; j < L; j++) {
                if(installed[loc - j]) return false;
                installed[loc - j] = true;
            }
        }
    }
    return true;
}

bool canMakeRow(int n) {
    
    // location, isRight
    vector<pair<int, bool>> spot;
    for(int i = 1; i < board[n].size(); i++) {
        if(board[n][i - 1] + 1 == board[n][i]) {
            spot.push_back({i - 1, false});
        } else if(board[n][i - 1] == board[n][i] + 1) {
            spot.push_back({i, true});
        } else if(abs(board[n][i - 1] - board[n][i]) >= 2) {
            return false;
        }
    }

    return canInstallRoad(spot);
}

bool canMakeCol(int n) {
    
    // location, isRight
    vector<pair<int, bool>> spot;
    for(int i = 1; i < board.size(); i++) {
        if(board[i - 1][n] + 1 == board[i][n]) {
            spot.push_back({i - 1, false});
        } else if(board[i - 1][n] == board[i][n] + 1) {
            spot.push_back({i, true});
        } else if(abs(board[i - 1][n] - board[i][n]) >= 2) {
            return false;
        }
    }

    return canInstallRoad(spot);
}

int main() {
    cin >> N >> L;
    board.assign(N, vector<int>(N, 0));

    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++) {
        if(canMakeRow(i)) cnt++;
    }

    
    for(int i = 0; i < N; i++) {
        if(canMakeCol(i)) cnt++;
    }

    cout << cnt;
    
    return 0;
}

 

 

 

개발 환경 : vscode

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

 

'알고리즘 > 백준(BOJ)' 카테고리의 다른 글

백준 - 2623 음악프로그램  (0) 2020.09.24
백준 - 1029 그림 교환  (0) 2020.09.24
백준 - 10942 팰린드롬?  (0) 2020.08.28
백준 - 1120 문자열  (0) 2020.08.28
백준 - 11656 접미사 배열  (0) 2020.08.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/04   »
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
글 보관함