ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준 14890] 경사로
    PS/C++ 2024. 7. 18.

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

     

    딱히 어떠한 알고리즘을 사용하는 경우가 없는 단순 구현 문제이다.

     

    삼성 B형 문제에서 나올 것 만 같은 구현 문제이다. 

     

    문제 조건에 맞춰서 구현을 하면 되는데 이런 문제들은 잘못된 곳을 찾기 매우 힘들기 때문에 평소에 breakpoint를 걸고 디버깅을 하는 연습과 반례를 만들어보는 연습을 하길 바란다..

     

    #include <bits/stdc++.h>
    #define FASTIO ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    using namespace std;
    int N, L, arr[101][101];
    bool instR[101][101], instC[101][101];
    int chkR(int i);
    int chkC(int j);
    int main() {
        FASTIO
        cin >> N >> L;
        for(int i = 1; i <= N; i++) {
            for(int j = 1; j <= N; j++) {
                cin >> arr[i][j];
            }
        }
        int res = 0;
        for(int i = 1; i <= N; i++) {
            res += chkR(i);
            res += chkC(i);
        }
        cout << res;
    }
    int chkR(int i) {
        for(int j = 1; j <= N - 1; j++) {
            if(abs(arr[i][j] - arr[i][j + 1]) >= 2) return 0;
            if(arr[i][j] - arr[i][j + 1] == -1) { // 증가
                for(int k = 0; k < L; k++) {
                    if(j - k <= 0 || arr[i][j] != arr[i][j - k] || instR[i][j - k]) return 0;
                }
                for(int k = 0; k < L; k++) {
                    instR[i][j - k] = true;
                }
            } else if(arr[i][j] - arr[i][j + 1] == 1) { // 감소
                for(int k = 1; k <= L; k++) {
                    if(j + k > N && arr[i][j + 1] != arr[i][j + k] || instR[i][j + k]) return 0;
                }
                for(int k = 1; k <= L; k++) {
                    instR[i][j + k] = true;
                }
            }
        }
        return 1;
    }
    int chkC(int j) {
        for(int i = 1; i <= N - 1; i++) {
            if(abs(arr[i][j] - arr[i + 1][j]) >= 2) return 0;
            if(arr[i][j] - arr[i + 1][j] == -1) { // 증가
                for(int k = 0; k < L; k++) {
                    if(i - k <= 0 || arr[i][j] != arr[i - k][j] || instC[i - k][j]) return 0;
                }
                for(int k = 0; k < L; k++) {
                    instC[i - k][j] = true;
                }
            } else if(arr[i][j] - arr[i + 1][j] == 1) { // 감소
                for(int k = 1; k <= L; k++) {
                    if(i + k > N && arr[i + 1][j] != arr[i + k][j] || instC[i + k][j]) return 0;
                }
                for(int k = 1; k <= L; k++) {
                    instC[i + k][j] = true;
                }
            }
        }
        return 1;
    }

    'PS > C++' 카테고리의 다른 글

    [백준 16455] K번째 수 찾는 함수  (0) 2024.07.25
    [백준 15685] 드래곤 커브  (0) 2024.07.22
    [백준 1744] 수 묶기  (0) 2024.07.18
    [백준 1766] 문제집  (0) 2024.07.18
    [백준 2529] 부등호  (0) 2024.07.18

    댓글

Designed by Tistory.