[백준OJ] 14890번 경사로
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
-풀이-
입력을 받은 뒤, 각각 행과 열의 처음을 기준으로, 끝까지 진행을 해가며 문제에 주어진 조건이 맞는지에 대한 검사를 실행했다.
경우의 수는 4가지가 있다.
1. 지금까지의 높이와 현재의 높이가 같을경우, cnt++를 해준다.
2. 지금까지의 높이+1 == 현재의 높이 인 경우. 즉 이전보다 한칸 높아진경우, 이때는 이전까지 일정높이를 유지해오며 증가시켜오던 cnt의 값이 l보다 작다면, 경사로를 놓을 여유가 되지 않는다는 뜻이므로 불가능 판정을 내린다. 만약 cnt의 값이 l보다 같거나 크다면, 경사로를 놓을 수 있으므로, height를 갱신시켜준뒤, cnt=1로 초기화시켜준다.
3. 지금까지의 높이-1==현재의 높이, 즉 이전칸보다 한칸 낮아진 경우, 이때는 2번보다 좀 복잡한데, 낮아진 칸을 기준으로, 높이를 유지해가며 l칸을 전진한다.
l칸을 전진하며 높이가 낮아진 경우, 경사로를 놓을 수 없으므로 불가능 판정을 내린다.
만약 l칸을 전진할때까지 높이가 일정한경우, 경사로를 놓을 수 있으므로 다음번 검사는 그 앞부터 하면된다.
4.만약 현재까지의 높이와 같지않거나, 1보다 큰 차이를 내는경우, 경사로를 놓을 수 없으므로 불가능 판정을 내리면된다.
-시간복잡도-
n행에 대해 각각n번 검사를 하고, n열에 대해 각각n번 검사하므로 시간복잡도는 O(N*N)이 된다.
-코드-
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int maze[100][100];
int n, l;
int main(){
cin >> n >> l;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> maze[i][j];
}
}
int result = 0;
for (int i = 0; i < n; i++) {
int cnt = 1;
int before = 0;
int height = maze[0][i];
bool flag = true;
for (int j = 1; j < n; j++) {
if (height == maze[j][i]) {
cnt++;
}
else if (height+1== maze[j][i]) {
if (cnt < l) {
flag = false;
break;
}
else {
height = maze[j][i];
cnt = 1;
}
}
else if(height-1==maze[j][i]){
cnt = 0;
height = maze[j][i];
while (maze[j][i] == height&&cnt<l) {
j++;
cnt++;
}
if (cnt < l) {
flag = false;
break;
}
j--;
cnt = 0;
}
else {
flag = false;
break;
}
}
if (flag) {
result++;
}
}
for (int i = 0; i < n; i++) {
int cnt = 1;
int before = 0;
int height = maze[i][0];
bool flag = true;
for (int j = 1; j < n; j++) {
if (height == maze[i][j]) {
cnt++;
}
else if (height + 1 == maze[i][j]) {
if (cnt < l) {
flag = false;
break;
}
else {
height = maze[i][j];
cnt = 1;
}
}
else if (height - 1 == maze[i][j]) {
cnt = 0;
height = maze[i][j];
while (maze[i][j] == height && cnt < l) {
j++;
cnt++;
}
if (cnt < l) {
flag = false;
break;
}
j--;
cnt = 0;
}
else {
flag = false;
break;
}
}
if (flag) {
result++;
}
}
cout << result;
}