백준 [14890] "경사로"

Kimbab1004·2024년 8월 25일
0

Algorithm

목록 보기
79/102

오답

#include <iostream>

using namespace std;

int n, l;

int map[100][100];

//dp값에는 옆에 값이 평평한지를 보는거야.
int dp[100][100] = { 1 };

int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };

int result = 0;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	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++) {
		bool flag = true;

		for (int j = 1; j < n; j++) {

			//같은 높이이면 넘어감
			if (map[i][j - 1] == map[i][j]) {
				dp[i][j] = dp[i][j-1] + 1;
				continue;
			}

			//현재 층이 이전 층보다 높은데 이전 층의 넓이가 2보다 작을 경우
			if ((map[i][j] == map[i][j - 1]+1 && dp[i][j - 1] < l) || map[i][j] > map[i][j - 1] + 1) {
				flag = false;
				break;
			}
			else if (map[i][j] == map[i][j - 1]+1 && dp[i][j - 1] >= l) {
				dp[i][j] = 0;
				continue;
			}
			//만약 현재 층의 크기가 이전 층보다 작을경우 현재층의 다음 층가지 봐야함
			else if (map[i][j] == map[i][j - 1] - 1) {
				//그런데 만약 범위가 넘어가면 break;
				if (j + 1 >= n) 
				{
					flag = false;
					break;
				}
				else {
					//범위가 넘어가지 않더라도 크기가 작아지면 break;
					if (map[i][j + 1] != map[i][j])
					{
						flag = false;
						break;
					}	
					else {
						continue;
					}
				}
			}
			else {
				flag == false;
				break;
			}
		}
		if (flag == true) {
			result++;
		}

	}

	memset(dp, 1, sizeof(dp));

	//세로 검사
	for (int i = 0; i < n; i++) {
		bool flag = true;

		for (int j = 1; j < n; j++) {

			//같은 높이이면 넘어감
			if (map[j-1][i] == map[j][i]) {
				dp[j][i] = dp[j-1][i] + 1;
				continue;
			}

			//현재 층이 이전 층보다 높은데 이전 층의 넓이가 2보다 작을 경우
			if ((map[j][i] == map[j-1][i]+1 && dp[j-1][i] < l) || map[i][j] > map[j-1][i] + 1) {
				flag = false;
				break;
			}
			else if (map[j][i] == map[j-1][i]+1 && dp[j-1][i] >= l) {
				dp[j][i] = 0;
				continue;
			}
			//만약 현재 층의 크기가 이전 층보다 작을경우 현재층의 다음 층가지 봐야함
			else if (map[j - 1][i] == map[j][i] - 1) {

				//그런데 만약 범위가 넘어가면 break;
				if (j + 1 >= n)
				{
					flag = false;
					break;
				}
				else {
					//범위가 넘어가지 않더라도 크기가 작아지면 break;
					if (map[j + 1][i] != map[j][i])
					{
						flag = false;
						break;
					}
					else {
						continue;
					}
				}
			}
			else {
				flag == false;
				break;
			}
		}
		if (flag == true) {
			result++;
		}
	}

	cout << result;

	return 0;
}

정답

#include <iostream>
#include <vector>

using namespace std;

int n, l;

int map[100][100];

int result = 0;

void input() {
	cin >> n >> l;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> map[i][j];
		}
	}
	return;
}

void answer() {
	cout << result;
}
//        v
//0 1 2 3 4 5 
//2 2 2 3 2 3
bool can_ramp(vector<int> &v) {
	vector<bool> check(n,false);
	for (int i = 1; i < n; i++) {
		//계단 높이가 같으면 검사할 필요가 없음
		if (v[i - 1] == v[i]) continue;

		//현재 칸이 전 칸보다 1칸 높을 경우
		else if (v[i] == v[i - 1] + 1) {
			for (int j = 1; j <= l; j++) 
				if (i - j < 0 || v[i - j] != v[i - 1] || check[i - j]) return false;
			for (int j = 1; j <= l; j++)
				check[i - j] = true;
			
		}
		//전 칸이 현재칸보다 1칸 높을 경우
		else if (v[i] + 1 == v[i - 1]) {
			for (int j = 0; j < l; j++)
				if (i + j >= n || v[i + j] != v[i] || check[i + j]) return false;
			for (int j = 0; j < l; j++)
				check[i + j] = true;
			i += l - 1;
		}
		else return false;
	}
	return true;
}

void solve() {
	//가로 검사
	for (int i = 0; i < n; i++) {
		vector<int> v;
		for (int j = 0; j < n; j++) {
			v.push_back(map[i][j]);
		}
		//만약 끝까지 경사로를 놓을 수 있으면 수 증가
		if (can_ramp(v)) {
			result++;
		}
	}
	for (int i = 0; i < n; i++) {
		vector<int> v;
		for (int j = 0; j < n; j++) {
			v.push_back(map[j][i]);
		}
		//만약 끝까지 경사로를 놓을 수 있으면 수 증가
		if (can_ramp(v)) {
			result++;
		}
	}
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	input();
	solve();
	answer();


	return 0;
}

0개의 댓글