알고리즘/백준 알고리즘
백준 14890번 경사로[C++] - 삼성 SW 역량 테스트 기출 문제
빠켱이
2021. 3. 25. 13:23
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n, l;
int LNum = 0;
int i, j; int isSlide, isOver;
int arr[100][100];
int isUsed[100][100][2];
int answer = 0;
int main() {
scanf("%d %d", &n, &l);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%d", &arr[i][j]);
for(i = 0; i < n; i++){ // 로우 확인
int before_num = arr[i][0];
isOver = 0;
for(j = 1; j < n; j++){
if(isOver)
break;
if(before_num == arr[i][j]) // 이전 숫자와 같으면 continue
continue;
else if(abs(before_num - arr[i][j]) >= 2){ // 이전 숫자와 2이상 차이나면 break;
isOver = 1;
break;
}
else if(before_num == arr[i][j] - 1){ //뒤에가 1만큼 더 크면 앞을 살핀다.
isSlide = 1;
for(int t = 0; (t < l) && (isSlide); t++){
if((j - (t+1) < 0) || (isUsed[i][j - (t + 1)][0])){ // 인덱스를 벗어나거나 사용한 인덱스이면 종료
isSlide = 0;
isOver = 1;
break;
}
if(arr[i][j - (t + 1)] != before_num){ // 비교하는 숫자와 다르면 답이 아님
isSlide = 0;
isOver = 1;
break;
}
isUsed[i][j - (t + 1)][0] = 1;
}
}
else { // 앞이 1만큼 더 크면 뒤를 살핀다.
isSlide = 1;
for(int t = 0; (t < l) && (isSlide) ; t++){
if((j + t == n)|| (isUsed[i][j + t][0])){ // 인덱스를 벗어나거나 사용한 인덱스이면 종료
isSlide = 0;
isOver = 1;
break;
}
if(arr[i][j + t] != before_num-1){
isSlide = 0;
isOver = 1;
break;
}
isUsed[i][j + t][0] = 1 ;
}
if(isSlide && !isOver )
j += (l-1);
}
if(isSlide)
before_num = arr[i][j];
}
if(!isOver)
answer++;
}
for (j = 0; j < n; j++) {
int before_num = arr[0][j];
isOver = 0;
for (i = 1; i < n; i++) {
if(isOver)
break;
if(before_num == arr[i][j])
continue;
else if(abs(before_num - arr[i][j]) >= 2){
isOver = 1;
break;
}
else if(before_num == arr[i][j] - 1){
isSlide = 1;
for(int t = 0; (t < l) && (isSlide); t++){
if((i - (t + 1) < 0) || (isUsed[i - (t + 1)][j][1])){
isSlide = 0;
isOver = 1;
break;
}
if(arr[i - (t + 1)][j] != before_num){
isSlide = 0;
isOver = 1;
break;
}
isUsed[i - (t + 1)][j][1] = 1;
}
}
else{
isSlide = 1;
for(int t = 0; (t < l) && (isSlide); t++){
if((i + t == n) || (isUsed[i + t][j][1])){
isSlide = 0;
isOver = 1;
break;
}
if(arr[i + t][j] != before_num - 1){
isSlide = 0;
isOver = 1;
break;
}
isUsed[i + t][j][1] = 1;
}
if(isSlide && !isOver)
i += (l - 1);
}
if(isSlide)
before_num = arr[i][j];
}
if(!isOver)
answer++;
}
printf("%d", answer);
}