반응형
이 문제는 살면서 제가 가장 싫어하는 문제 1순위 입니다.
풀이를 봐도 뭐지 싶은, 정말 풀기가 꺼려지는 문제였습니다.
며칠동안, 붙잡다가 포기하고 다른 문제를 풀기를 반복이었습니다.
정말 답답했고 정말 싫어.. 다신 보지 말자.
알고리즘이 있다기보다, 그냥 시뮬레이션 구현 문제입니다.
정~~~~~~말 많은 블로그들의 풀이를 봤지만,
이해하는 데에는 이 블로그가 저에게 큰 힘이 되었습니다.
https://keykat7.blogspot.com/2019/10/14890.html
아무쪼록 모두 평온하시길 바랍니다.
#include <iostream>
#include <cstring>
using namespace std;
int N, L;
int MAP[100][100];
bool VISIT[100][100];
int main() {
cin >> N >> L;
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
cin >> MAP[i][j];
}
}
int C = 0;
for(int i = 0; i < N; i++) {
memset(VISIT, 0 , sizeof(VISIT));
bool flag = true;
for(int j = 1; j < N; j++) {
// 높은 경사로를 만났다.
if((MAP[i][j - 1] + 1) <= MAP[i][j]) {
for(int k = j - L; k < j; k++) {
if(k < 0 || VISIT[i][k] || MAP[i][k] != (MAP[i][j] - 1)) {
flag = false;
break;
} else {
VISIT[i][k] = true;
}
}
}
// 낮은 경사로를 만났다.
else if(MAP[i][j - 1] >= (MAP[i][j] + 1)) {
for(int k = j; k < j + L; k++) {
if(k >= N || VISIT[i][k] || MAP[i][k] != (MAP[i][j- 1] - 1)) {
flag = false;
break;
} else
VISIT[i][k] = true;
}
}
if(!flag)
break;
}
if(flag)
C++;
}
for(int i = 0; i < N; i++) {
memset(VISIT, 0 , sizeof(VISIT));
bool flag = true;
for(int j = 1; j < N; j++) {
// 높은 경사로를 만났다.
if((MAP[j - 1][i] + 1) <= MAP[j][i]) {
for(int k = j - L; k < j; k++) {
if(k < 0 || VISIT[k][i] || MAP[k][i] != (MAP[j][i] - 1)) {
flag = false;
break;
} else {
VISIT[k][i] = true;
}
}
}
// 낮은 경사로를 만났다.
else if(MAP[j - 1][i] >= (MAP[j][i] + 1)) {
for(int k = j; k < j + L; k++) {
if(k >= N || VISIT[k][i] || MAP[k][i] != (MAP[j-1][i] - 1)) {
flag = false;
break;
} else
VISIT[k][i] = true;
}
}
if(!flag)
break;
}
if(flag)
C++;
}
cout << C << "\n";
}
가로 방향으로는 익숙한 탓에 쉽게 구현했고
세로 방향은, 가로 방향의 대칭이동을 한다고 보면 됩니다. 어렵지만..
소요 시간 : 측정 불가
반응형
'[백준]' 카테고리의 다른 글
[BaekJoon/백준] 21610번 마법사 상어와 비바라기 (0) | 2022.10.06 |
---|---|
[BaekJoon/백준] 20057번 마법사 상어와 토네이도 (0) | 2022.10.06 |
[BaekJoon/백준] 5558번 Cheese (0) | 2022.08.04 |
[BaekJoon/백준] 1600번 말이 되고픈 원숭이 (0) | 2022.08.03 |
[BaekJoon/백준] 1520번 내리막 길 (0) | 2022.08.02 |