백준 14890 경사로 ❌

CJB_ny·2023년 3월 5일
0

백준

목록 보기
95/104
post-thumbnail

경사로


분석

열 탐색은 캐시 프렌들리 하지않다.
그래서 "대칭행렬"을 만들어서 같은 함수를 호출 두번만 해주는 식으로 바꿔야한다.
(전치행렬)

cnt 늘려주는 부분도 올라갈 경우 ++cnt하다 l과 같은지보고
cnt를 음수까지 확장해서 ++cnt해서 0과 값을 비교한다.

후기

어려웠음..

일단 전치행렬 사용한다는 부분과 cnt를 음수까지확장해서 카운트 하는 부분과

Sovle의 for문 로직을 돌고나서 cnt값을 최종적으로 가능한 값인지 아닌지 if문으로 확인 하는 부분이 좀 지렸던거 같다.

CPP

#include <iostream>
#include <cstring>
using namespace std;
#define endl "\n"
#define ll long long
#define MAX 104

int n, l, a[MAX][MAX], b[MAX][MAX], ret = 0;

void Solve(int arr[MAX][MAX])
{
	for (int i = 0; i < n; ++i)
	{
		int cnt = 1;
		int j;
		for (j = 0; j < n - 1; j++)
		{
			// 같은 경우
			if (arr[i][j] == arr[i][j + 1]) cnt++;
			// 1칸 더 작은 경우 (올라가는 경사로, 현재 위치가 더 낮다)
			else if (arr[i][j] + 1 == arr[i][j + 1] && cnt >= l) cnt = 1;
			// 1칸 더 작은 경우 (내려가는 경사로, 현재 위치가 더 높다)
			else if (arr[i][j] - 1 == arr[i][j + 1] && cnt >= 0) cnt = -l + 1;
			else break;
		}
		if (j == n - 1 && cnt >= 0) ret++;
	}
	return;
}

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 >> a[i][j];
			b[j][i] = a[i][j];
		}
	}

	Solve(a); 
	Solve(b);
	cout << ret << endl;

	return 0;
}
profile
공부 일기장으로 변해버린 블로그 (https://cjbworld.tistory.com/ <- 이사중)

0개의 댓글