백준 14890번: 경사로

danbibibi·2022년 10월 9일
0

문제

문제 바로가기> 백준 14890번: 경사로

풀이

문제를 보자마자 그 전까지 동일한 높이의 개수를 저장하는 cnt 변수를 사용해서 문제를 풀어야겠다고 생각했다. 그런데, 만약 높이가 낮아지는 경우라면? 이라는 생각에 틀린 접근법인가? 라는 생각도 들었다. 하지만 높이가 낮아지는 경우, 미래 지향적?으로 1-L (앞으로 필요할 높이)를 넣어 해결해 줄 수 있었다 ,, 이건 내 아이디어는 아니지만,, 이렇게도 작성할 수 있구나를 배웠다,, 😊

#include<iostream>
#define MAX 101
using namespace std;

int N, L;
int map[MAX][MAX];

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

void solution() {
	int ans = 0;

	// 1. row 확인 
	for (int row = 0; row < N; row++) {
		int cnt = 1;  
		bool ismake = true;
		for (int col = 0; col + 1 < N; col++) {
			if (map[row][col] == map[row][col + 1]) cnt++; // 높이가 동일한 경우
			else if (map[row][col] - map[row][col + 1] == -1) { // 높이가 높아지는 경우
				if (cnt >= L) cnt = 1;
				else ismake = false;
			}
			else if (map[row][col] - map[row][col + 1] == 1) { // 높이가 낮아지는 경우
				if (cnt < 0) ismake = false;
				else cnt = 1 - L;
			}
			else ismake = false;
		}
		if (cnt >= 0 && ismake) ans += 1;
	}
	
	// 2. col 확인
	for (int col = 0; col < N; col++) {
		int cnt = 1;
		bool ismake = true;
		for (int row = 0; row + 1 < N; row++) {
			if (map[row][col] == map[row + 1][col]) cnt++; // 높이가 동일한 경우
			else if (map[row][col] - map[row + 1][col] == -1) { // 높이가 높아지는 경우
				if (cnt >= L) cnt = 1;
				else ismake = false;
			}
			else if (map[row][col] - map[row + 1][col] == 1) { // 높이가 낮아지는 경우
				if (cnt < 0) ismake = false;
				else cnt = 1 - L;
			}
			else ismake = false;
		}
		if (cnt >= 0 && ismake) ans += 1;
	}

	cout << ans;
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	input();
	solution();
}
profile
블로그 이전) https://danbibibi.tistory.com

0개의 댓글