출처 : https://www.acmicpc.net/problem/14890
풀이 방법
길이가 같을 땐 count를 올리다가 높이 차이가 정확하게 1 정도만 난다면 경사로를 추가해서 이동하는 문제이다
먼저 새로와 가로를 나누어 2번 for문을 반복했다.
또한 cnt변수를 두어 현재까지의 연속된 길이를 저장하고, 높이가 높아졌을 때 L보다 크면 cnt를 1로 초기화했다. 또한 높이가 낮아졌을 때는 cnt를 -L+1을 하는 과정을 두어 이후에 같은 길이가 L개의 같은 길이가 나오게 된다면 가능한 경우로 설정했다. 만약 그전에 높이가 다르게 된다면 플레그 변수를 false로 설정했다.
#include <iostream>
#include <vector>
using namespace std;
int N, L;
int board[101][101];
int ans = 0;
int main() {
cin >> N >> L;
for (int i = 0;i < N;i++) {
for (int j = 0;j < N;j++) {
cin >> board[i][j]; // 보드 입력 받음
}
}
for (int i = 0;i < N;i++) { // 새로 검사 올라가는 경우
int cnt = 1;
bool flag = true;
for (int j = 0;j < N-1;j++) {
if (board[j][i] == board[j+1][i]) { //같은 경우 cnt값 +1
cnt++;
}
else if (board[j][i] - board[j+1][i] == -1) {
if (cnt >= L) { // 오르막이 가능한 경우
cnt = 1;
}
else { // 이전에 L개의 동일한 길이가 나오지 않은 경우
flag = false;
}
}
else if (board[j][i] - board[j+1][i] == 1) {
if (cnt >= 0) // 가능한 경우
cnt = -L + 1; // 이후로 연속된 L개의 같은 길이가 나와야 한다.
else flag = false;
}
else flag = false;
}
if (cnt < 0) flag = false; // 현재 마이너스라면 false
if (flag) ans++; // 가능한 경우
}
for (int i = 0;i < N;i++) { // 가로 검사 올라가는 경우
int cnt = 1;
bool flag = true;
for (int j = 0;j < N-1;j++) {
if (board[i][j] == board[i][j+1]) { // 같은 경우
cnt++;
}
else if (board[i][j] - board[i][j+1] == -1) { // 올라가는 경우
if (cnt >= L) {
cnt = 1;
}
else {
flag = false;
}
}
else if (board[i][j] - board[i][j+1] == 1) { // 내려 가는 경우
if (cnt >= 0)
cnt = -L + 1;
else flag = false;
}
else flag = false;
}
if (cnt < 0) flag = false;
if (flag) ans++;
}
cout << ans;
return 0;
}
'Algorithm' 카테고리의 다른 글
[백준] 미세먼지 안녕! 17144번 (c++) 구현, 로컬 배열 선언의 중요, 탐색 순서의 중요 (1) | 2024.10.03 |
---|---|
[백준] 수 묶기 1744번 (c++) 그리디, 수를 잘 나누기 (0) | 2024.10.02 |
[백준] 퇴사 2 15486번 (c++) dp 최댓값으로 갱신하기 (1) | 2024.10.01 |
[백준] 친구비 16562번 (c++) bfs (0) | 2024.09.24 |
[백준] 미로만들기 2662번 (c++) bfs, 우선순위 큐 (0) | 2024.09.23 |