본문 바로가기
[백준]

[BaekJoon/백준] 14890 경사로

by Hevton 2022. 8. 5.
반응형

 

이 문제는 살면서 제가 가장 싫어하는 문제 1순위 입니다.

 

 

풀이를 봐도 뭐지 싶은, 정말 풀기가 꺼려지는 문제였습니다.

 

 

며칠동안, 붙잡다가 포기하고 다른 문제를 풀기를 반복이었습니다.

 

 

정말 답답했고 정말 싫어.. 다신 보지 말자.

 

 

알고리즘이 있다기보다, 그냥 시뮬레이션 구현 문제입니다.

 

정~~~~~~말 많은 블로그들의 풀이를 봤지만,

이해하는 데에는 이 블로그가 저에게 큰 힘이 되었습니다.

https://keykat7.blogspot.com/2019/10/14890.html

 

아무쪼록 모두 평온하시길 바랍니다.

#include <iostream>
#include <cstring>

using namespace std;


int N, L;

int MAP[100][100];
bool VISIT[100][100];

int main() {
    
    
    cin >> N >> L;
    
    
    
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < N; j++) {
            
            cin >> MAP[i][j];
            
        }
    }
    
    int C = 0;
    
    for(int i = 0; i < N; i++) {
        
        memset(VISIT, 0 , sizeof(VISIT));
        bool flag = true;
        for(int j = 1; j < N; j++) {
            
            
            // 높은 경사로를 만났다.
            if((MAP[i][j - 1] + 1) <= MAP[i][j]) {
                
                for(int k = j - L; k < j; k++) {
                    
                    if(k < 0 || VISIT[i][k] || MAP[i][k] != (MAP[i][j] - 1)) {
                        flag = false;
                        break;
                    } else {
                        VISIT[i][k] = true;
                    }
                                     
                    
                }
                
            }
            // 낮은 경사로를 만났다.
            else if(MAP[i][j - 1] >= (MAP[i][j] + 1)) {
                
                for(int k = j; k < j + L; k++) {
                    
                    if(k >= N || VISIT[i][k] || MAP[i][k] != (MAP[i][j- 1] - 1)) {
                        flag = false;
                        break;
                    } else
                        VISIT[i][k] = true;
                                        
                }
                
            }
            
            if(!flag)
                break;
        }
        
        if(flag)
            C++;
    }
    
    
    
    for(int i = 0; i < N; i++) {
        
        memset(VISIT, 0 , sizeof(VISIT));
        bool flag = true;
        for(int j = 1; j < N; j++) {
            
            
            // 높은 경사로를 만났다.
            if((MAP[j - 1][i] + 1) <= MAP[j][i]) {
                
                for(int k = j - L; k < j; k++) {
                    
                    if(k < 0 || VISIT[k][i] || MAP[k][i] != (MAP[j][i] - 1)) {
                        flag = false;
                        break;
                    } else {
                        VISIT[k][i] = true;
                    }
                                     
                    
                }
                
            }
            // 낮은 경사로를 만났다.
            else if(MAP[j - 1][i] >= (MAP[j][i] + 1)) {
                
                for(int k = j; k < j + L; k++) {
                    
                    if(k >= N || VISIT[k][i] || MAP[k][i] != (MAP[j-1][i] - 1)) {
                        flag = false;
                        break;
                    } else
                        VISIT[k][i] = true;
                                        
                }
                
            }
            
            if(!flag)
                break;
        }
        
        if(flag)
            C++;
    }

    
    
    
    cout << C << "\n";
}

 

가로 방향으로는 익숙한 탓에 쉽게 구현했고

세로 방향은, 가로 방향의 대칭이동을 한다고 보면 됩니다. 어렵지만..

 

 

 

소요 시간 : 측정 불가

반응형