Algorithm/백준
[백준][14890번] 경사로
1일1코딩
2020. 4. 25. 16:58
https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
풀이과정
1. 가로, 세로 방향을 체크해주었다.
2. 이전값과 현재값이 달라지는 구간에서 경사로가 필요하다.
3. 값이 달라지는 경우!!
prev < cur의 경우 prev와 같은 값을 가지는 갯수를 체크해 지나왔기 때문에 그걸 이용해 경사로 길이보다 크다면 OK
prev > cur 경우 cur에서 L길이의 경사로를 놓을 수 있는지 체크해준다.
소스코드
더보기
#include <stdio.h>
enum DIR {ROW, COL};
int map[100][100];
int N, L;
int answer;
int abs(int n) { return n >= 0 ? n : n * -1; };
int checkLine(int start, int dir)
{
if (dir == DIR::ROW) {
int prev = map[start][0];
int prevLen = 1;
for (int i = 1; i < N; i++) {
int cur = map[start][i];
if (prev != cur) {
if (abs(prev - cur) != 1) {
return 0;
}
if (cur < prev) {
for (int j = 1; j < L; j++) {
if (map[start][i + j] != cur) {
return 0;
}
}
i = i + L - 1;
prevLen = 0;
prev = cur;
continue;
}
else {
if (prevLen < L) {
return 0;
}
}
prev = cur;
prevLen = 1;
}
else {
prevLen++;
}
}
return 1;
}
else {
int prev = map[0][start];
int prevLen = 1;
for (int i = 1; i < N; i++) {
int cur = map[i][start];
if (prev != cur) {
if (abs(prev - cur) != 1) {
return 0;
}
if (cur < prev) {
for (int j = 1; j < L; j++) {
if (map[i + j][start] != cur) {
return 0;
}
}
i = i + L - 1;
prevLen = 0;
prev = cur;
continue;
}
else {
if (prevLen < L) {
return 0;
}
}
prev = cur;
prevLen = 1;
}
else {
prevLen++;
}
}
return 1;
}
}
void solution()
{
for (int i = 0; i < N; i++) {
if (checkLine(i, DIR::ROW)) {
answer++;
}
if (checkLine(i, DIR::COL)) {
answer++;
}
}
}
int main()
{
scanf("%d %d" ,&N, &L);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%d", &map[i][j]);
}
}
solution();
printf("%d\n", answer);
}
결과