프론트엔드 개발 블로그

BOJ 14890 : 경사로

by heeji_

지저분 그자체

[정답 코드]

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

//디버깅용 프린트함수
void print(vector<vector<int>>&v) {
	for (int i = 0; i < v.size(); i++) {
		for (int j = 0; j < v[i].size(); j++) {
			cout << v[i][j];
		}
		cout << "\n";
	}
}
void print_2(vector<int>&v) {
	for (int i = 0; i < v.size(); i++) {
		cout << v[i];
	}
}

const int MAX = 101;
int answer = 0; //답 개수
//N=세로,y M=가로,x
int N, M;
int L;

bool isContinued(vector<int>&v, int node) {
	for (int i = 1; i <= L; i++) {
		if (v[node] != v[node - i]) {
			return false;
		}
	}
	return true;
}

//행,열 한 줄의 정보를 받아서 
//지나갈 수 있는 길의 개수를 찾는 함수
void find(vector<int>&v) {
	//경사로 둔 곳 체크
	bool vis[MAX];
	memset(vis, false, sizeof(vis));
	bool isPossible = true;

	for (int i = 0; i < v.size(); i++) {
		if (i + 1 >= N) {
			answer += 1;
			break;
		}
		if (v[i] == v[i + 1]) continue;
		if (v[i] + 1 < v[i + 1] || v[i]>v[i+1]+1) {
			isPossible = false;
			break;
		}
		else if(v[i]<v[i+1]){
			bool flag = true;
			//현재기점, 이전L길이만큼 연속인가 check
			if (L == 1) {
				if (vis[i] == true) {
					flag = false;
					isPossible = false;
					break;
				}
			}
			else {
				for (int j = 1; j < L; j++) {
					if (i - j < 0) {
						flag = false;
						isPossible = false;
						break;
					}
					if (v[i] != v[i - j]) {
						flag = false;
						isPossible = false;
					}
					if (vis[i - j] == true) {
						flag = false;
						isPossible = false;
					}
				}
			}				

			if (flag) {
				for (int j = 0; j < L; j++) {
					vis[i - j] = true;
				}
			}
		}
		else if (v[i] > v[i + 1]) {
			bool flag2 = true;
			int next = i + 1;

			if (L == 1) {
				vis[next] = true;
				continue;
			}

			//현재기점, 다음 L길이만큼 연속인가 check
			for (int j = 1; j < L; j++) {
				if (next + j >= N) {
					flag2 = false;
					isPossible = false;
					break;
				}
				if (v[next] != v[next+j]) {
					flag2 = false;
					isPossible = false;
					break;
				}
				if (vis[next + j] == true) {
					flag2 = false;
				}
			}

			if (flag2) {
				for (int j = 0; j < L; j++) {
					vis[next+j] = true;
				}
			}
		}

		if (!isPossible) break;
	}
	
	return;
}

int main() {

	cin >> N >> L;
	M = N;
	//map 이차원 배열 선언
	vector<vector<int>> map(N, vector<int>(M));
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cin >> map[i][j];
		}
	}
	//가로방향 탐색
	
	for (int i = 0; i < N; i++) {
		find(map[i]);
	}
	
	//세로방향은 어떻게 보지?
	
	
	for (int j = 0; j < M; j++) {
		vector<int> ymap;
		for (int i = 0; i < N; i++) {
			ymap.push_back(map[i][j]);
			
		}
		find(ymap);
	}
	
	cout << answer << "\n";

	return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

BOJ 17143 : 낚시왕  (0) 2021.04.19
BOJ 15686 : 치킨 배달  (0) 2021.04.18
BOJ 14502 : 연구소  (0) 2021.04.14
BOJ 16953 : A→B  (0) 2021.04.08
BOJ 7576 : 토마토 ☆  (0) 2021.04.07

블로그의 정보

아자아자

heeji_

활동하기