ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 14890번 경사로
    PS 2020. 2. 19. 17:07

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

     

    14890번: 경사로

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

    www.acmicpc.net

     

     

     

     

    <접근방법>

    시뮬레이션 문제입니다.

    단순하게 하나하나 구현한다면 복붙한다해도 시간이 걸릴 것 입니다.

    보통 이런 문제들은 생각을 살짝 바꾼다면 하나의 모듈에 여러 상황을 담을 수 있습니다.

     

    행 오른쪽 경사로 탐색, 행 왼쪽 경사로 탐색, 열 위쪽 경사로 탐색, 열 아래쪽 경사로 탐색

     

    문제에서 고려해야 할 상황입니다.

     

    행과 열은 회전만 시켜주면 똑같은 것이고

    오른쪽, 왼쪽은 뒤집으면 똑같은 것 입니다.

     

    즉, 전처리로 저렇게 해주면 탐색 모듈은 하나만 있으면 됩니다.


     

     

     

    <코드>

    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    struct point {
    	int y, x;
    };
    
    int n, l, map[101][101];
    int ans;
    
    bool check(vector<int> v, bool visit[], int type) {
    	for (int i = 0; i < n - 1; i++) {
    		int val = v[i];
    		int nval = v[i + 1];
    
    		if (nval - val > 1) return false;
    		if (nval - val == 1) {
    			//경사로를 놓을 길이 체크
    			int end;
    			if (type == 0)	end = i - l + 1;
    			else	end = i - l + 1;
    
    			if (end < 0 || end >= n) return false;
    
    			int start;
    			if (type == 0)	start = i;
    			else	start = i;
    
    			//방문 체크
    			for (int j = end; j <= start; j++) {
    				if (visit[j])	return false;
    			}
    
    			//방문 처리
    			for (int j = end; j <= start; j++) {
    				visit[j] = true;
    			}
    		}
    	}
    	return true;
    }
    
    void simul_row(vector<int> v) {
    	bool visit[101] = { false, };
    
    	if (!check(v, visit, 0)) return;
    
    	reverse(visit, visit + n);
    	reverse(v.begin(), v.end());
    
    	if (!check(v, visit, 0)) return;
    
    	ans++;
    }
    
    void simul_col(vector<int> v) {
    	bool visit[101] = { false, };
    
    	if (!check(v, visit, 1)) return;
    
    	reverse(visit, visit + n);
    	reverse(v.begin(), v.end());
    
    	if (!check(v, visit, 1)) return;
    
    	ans++;
    }
    
    int main() {
    	cin >> n >> l;
    	for (int i = 0; i < n; i++) {
    		for (int j = 0; j < n; j++) {
    			cin >> map[i][j];
    		}
    	}
    
    	for (int i = 0; i < n; i++) {
    		vector<int> v;
    		for (int j = 0; j < n; j++) {
    			v.push_back(map[i][j]);
    		}
    		simul_row(v);
    	}
    
    	for (int j = 0; j < n; j++) {
    		vector<int> v;
    		for (int i = 0; i < n; i++) {
    			v.push_back(map[i][j]);
    		}
    		simul_col(v);
    	}
    
    
    	cout << ans << '\n';
    	return 0;
    }

     

     


     

     

    <느낀 점>

    -구현 복잡성

     

     

     

     

     

     

    반응형

    'PS' 카테고리의 다른 글

    백준 2169번 로봇 조종하기  (0) 2020.02.24
    백준 1194번 달이 차오른다, 가자  (0) 2020.02.24
    백준 1938번 통나무 옮기기  (0) 2020.02.19
    백준 1600번 말이 되고픈 원숭이  (0) 2020.02.19
    백준 16397번 탈출  (0) 2020.02.19
Designed by Tistory.