Skip to content

Instantly share code, notes, and snippets.

@niklasjang
Created April 27, 2020 15:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save niklasjang/acba7cd79987f58c1484be8087833aca to your computer and use it in GitHub Desktop.
Save niklasjang/acba7cd79987f58c1484be8087833aca to your computer and use it in GitHub Desktop.
[PS][기출문제][삼성]/[BOJ][14890][경사로]
#include <iostream>
using namespace std;
int n, l, ans = 0, i, j, cnt;
int map[200][100];
int main(void) {
cin >> n >> l;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
cin >> map[i][j];
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
map[i + n][j] = map[j][i];
for (i = 0; i < n * 2; i++) {
cnt = 1;
for (j = 0; j < n - 1; j++) {
if (map[i][j] == map[i][j + 1]) cnt++;
else if (map[i][j] + 1 == map[i][j + 1] && cnt >= l) cnt = 1;
else if (map[i][j] - 1 == map[i][j + 1] && cnt >= 0) cnt = -l + 1;
else break;
}
if (j == n - 1 && cnt >= 0) ans++;
}
printf("%d", ans);
return 0;
}
@niklasjang
Copy link
Author

niklasjang commented Apr 27, 2020

#include <iostream>
#include <string.h>
using namespace std;

int n = 0, l = 0;
int map[100][100];
bool visited[100][100];
int ans = 0;

bool in_range(int x) {
	return 0 <= x && x < n;
}

int goRight(void) {
	int i = 0, j = 0;
	int ret = 0;
	for (i = 0; i < n; i++) {
		//오른쪽으로 가면서 확인
		bool flag = false;
		for (j = 0; j < n - 1; j++) {
			int diff = map[i][j + 1] - map[i][j];
			if (diff <= 0) {
				continue;
			}
			else if (diff >= 2) {
				flag = true;
				break;
			}
			else if (diff == 1) {
				//다리 놓을 수 있는지 체크
				for (int k = 0; k < l; k++) {
					if (!in_range(j - k) || visited[i][j - k] ||
						map[i][j + 1] - map[i][j - k] != 1) {
						//cout << "다리 못놓음\n";
						flag = true;
						break;
					}
				}
				if (!flag) {
					//cout << "다리 놓기\n";
					for (int k = 0; k < l; k++) {
						visited[i][j - k] = true;
					}
				}
				else {
					break;
				}
			}
		}
		if (flag) continue;
		////왼쪽으로 오면서 확인
		for (j = n - 1; j > 0; j--) {
			int diff = map[i][j - 1] - map[i][j];
			if (diff <= 0) {
				continue;
			}
			else if (diff >= 2) {
				flag = true;
				break;
			}
			else if (diff == 1) {
				//cout << i << "," << j << ">";
				//다리 놓을 수 있는지 체크
				for (int k = 0; k < l; k++) {
					if (!in_range(j + k) || visited[i][j + k] ||
						map[i][j - 1] - map[i][j + k] != 1) {
						//cout << "다리 못놓음\n";
						flag = true;
						break;
					}
				}
				if (!flag) {
					//cout << "다리 놓기\n";
					for (int k = 0; k < l; k++) {
						visited[i][j + k] = true;
					}
				}
				else {
					break;
				}
			}
		}
		if (flag) continue;
		ret++;
	}
	return ret;
}

int  goDown(void) {
	int i = 0, j = 0;
	int ret = 0;
	for (j = 0; j < n; j++) {
		//아래로 가면서 확인
		bool flag = false;
		for (i = 0; i < n - 1; i++) {
			int diff = map[i + 1][j] - map[i][j];
			if (diff <= 0) {
				continue;
			}
			else if (diff >= 2) {
				flag = true;
				break;
			}
			else if (diff == 1) {
				//다리 놓을 수 있는지 체크
				for (int k = 0; k < l; k++) {
					if (!in_range(i - k) || visited[i - k][j] ||
						map[i + 1][j] - map[i][j] != 1) {
						flag = true;
						break;
					}
				}
				if (!flag) {
					for (int k = 0; k < l; k++) {
						visited[i - k][j] = true;
					}
				}
				else {
					break;
				}
			}
		}
		if (flag) continue;
		//위로 오면서 확인
		for (i = n - 1; i > 0; i--) {
			int diff = map[i - 1][j] - map[i][j];
			if (diff <= 0) {
				continue;
			}
			else if (diff >= 2) {
				flag = true;
				break;
			}
			else if (diff == 1) {
				//다리 놓을 수 있는지 체크
				for (int k = 0; k < l; k++) {
					if (!in_range(i + k) || visited[i + k][j] ||
						map[i - 1][j] - map[i + k][j] != 1) {
						flag = true;
						break;
					}
				}
				if (!flag) {
					for (int k = 0; k < l; k++) {
						visited[i + k][j] = true;
					}
				}
				else {
					break;
				}
			}
		}
		if (flag) continue;
		ret++;
	}
	return ret;

}

void solve(void) {
	ans += goRight();
	memset(visited, false, sizeof(visited));
	ans += goDown();
}
int main(void) {
	cin >> n >> l;
	int i = 0, j = 0;
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			cin >> map[i][j];
		}
	}
	solve();
	cout << ans << "\n";
	return 0;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment