Algorithm

[백준] 경사로 14890 (c++) 구현

salmon16 2024. 10. 2. 16:00

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

풀이 방법

길이가 같을 땐 count를 올리다가 높이 차이가 정확하게 1 정도만 난다면 경사로를 추가해서 이동하는 문제이다

먼저 새로와 가로를 나누어 2번 for문을 반복했다.

또한 cnt변수를 두어 현재까지의 연속된 길이를 저장하고, 높이가 높아졌을 때 L보다 크면 cnt를 1로 초기화했다. 또한 높이가 낮아졌을 때는 cnt를 -L+1을 하는 과정을 두어 이후에 같은 길이가 L개의 같은 길이가 나오게 된다면 가능한 경우로 설정했다. 만약 그전에 높이가 다르게 된다면 플레그 변수를 false로 설정했다. 

 

#include <iostream>
#include <vector>

using namespace std;
int N, L;
int board[101][101];

int ans = 0;
int main() {
    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 cnt = 1;
        bool flag = true;
        for (int j = 0;j < N-1;j++) {
            if (board[j][i] == board[j+1][i]) { //같은 경우 cnt값 +1
                cnt++;
            }
            else if (board[j][i] - board[j+1][i] == -1) {
                if (cnt >= L) { // 오르막이 가능한 경우
                    cnt = 1;
                }
                else { // 이전에 L개의 동일한 길이가 나오지 않은 경우
                    flag = false;
                }
            }
            else if (board[j][i] - board[j+1][i] == 1) {
                if (cnt >= 0) // 가능한 경우
                    cnt = -L + 1; // 이후로 연속된 L개의 같은 길이가 나와야 한다.
                else flag = false;
            }
            else flag = false;
        }
        if (cnt < 0) flag = false; // 현재 마이너스라면 false
        if (flag) ans++; // 가능한 경우 
    }
    
    for (int i = 0;i < N;i++) { // 가로 검사 올라가는 경우
        int cnt = 1;
        bool flag = true;
        for (int j = 0;j < N-1;j++) {
            if (board[i][j] == board[i][j+1]) { // 같은 경우 
                cnt++;
            }
            else if (board[i][j] - board[i][j+1] == -1) { // 올라가는 경우
                if (cnt >= L) {
                    cnt = 1;
                }
                else {
                    flag = false;
                }
            }
            else if (board[i][j] - board[i][j+1] == 1) { // 내려 가는 경우
                if (cnt >= 0)
                    cnt = -L + 1;
                else flag = false;
            }
            else flag = false;
        }
        if (cnt < 0) flag = false;
        if (flag) ans++;            
    }      

        
    cout << ans;
    return 0;
}