본문 바로가기
백준 문제풀이

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

by 꽁이꽁설꽁돌 2024. 7. 26.
728x90
반응형

목차

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

    문제

     

    문제 구현 방향

    생각보다 까다로웠던 문제였다.. 플래그 변수와 ex변수를 통해 검사하였다.

     

     

     

     

    가져갈 아이디어

     

    1. 대칭 배열

    함수를 두번 구현하기 싫어서 대칭 배열을 만들었다.

    int boardA[101][101] = { 0 };
    int boardB[101][101] = { 0 };
    
    int main() {
    	cin >> N >> L;
    	for (int i = 0; i < N; i++) {
    		for (int j = 0; j < N; j++) {
    			cin >> boardA[i][j];
    			boardB[j][i] = boardA[i][j];
    		}
    	}
    
    }

     

     

    2. 함수 끝에 이전 배열 저장하기

    int check(int board[101][101]) {
    	int ex = board[0][0];
    	for (int j = 0; j < N; j++) {
       		int current = board[0][j];
            //이런식으로 이전것과 현재것을 비교가능
            ex = board[0][j];
    	}
    	if (cant)
    		cnt++;
    			
    }
    	return cnt;
    }

     

     

    코드 구현

    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<vector>
    #include<math.h>
    #include<queue>
    
    using namespace std;
    
    int N, L;
    int boardA[101][101] = { 0 };
    int boardB[101][101] = { 0 };
    int total = 0;
    
    int check(int board[101][101]) {
    	int cnt = 0;
    	for (int i = 0; i < N; i++) {
    		int flag = 0;   //내리막길
    		int pass = 0;
    		int cant = 1;
    		int ex = board[i][0];
    		for (int j = 0; j < N; j++) {
    			if (abs(board[i][j] - ex) >1) {
    				cant = 0;
    				break;
    			}
    			//평지
    			else if (ex - board[i][j] == 0) {
    				pass++;
    			}
    			else {
    				//오르막길
    				if (board[i][j] - ex == 1) {
    					if (pass < L) {
    						cant = 0;
    						break;
    					}
    					pass = 1;
    				}
    				//내리막길
    				else if (ex - board[i][j] == 1) {
    					pass = 0;
    					int comp = board[i][j];
    					for (int p = 0; p < L-1; p++) {
    						j += 1;
    						if (j > N - 1) {
    							cant = 0;
    							break;
    						}
    						if (board[i][j] != comp)
    						{
    							cant = 0;
    							break;
    						}
    					}
    				}
    			}
    			ex = board[i][j];
    		}
    		if (cant)
    			cnt++;
    			
    	}
    	return cnt;
    }
    
    int main() {
    	cin >> N >> L;
    	for (int i = 0; i < N; i++) {
    		for (int j = 0; j < N; j++) {
    			cin >> boardA[i][j];
    			boardB[j][i] = boardA[i][j];
    		}
    	}
    
    	total += check(boardA);
    	total += check(boardB);
    	cout << total;
    }
    반응형