https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
문제풀이 :
행과 열을 체크하는 함수 생성
높이에 따라 분류
1. 높이가 +2, -2 이상 차이나는 경우 false를 return
2. 높이가 같은 경우 stack +1
3. 오르막길인 경우
3 - 1. 그 전까지의 stack이 L 보다 큰 경우 통과
3 - 2. stack이 L보다 작은 경우 false를 return
4. 내리막길인 경우
4 - 1. 내리막길을 확인하는 downFlag = 1, stack = 1
4 - 2. downFlag 1 일 때 높이의 변화가 생기면 false를 return
4 - 3. 높이가 일정하면 stack + 1, stack 이 L과 같아지면 downFlag = 0, stack = 0
4 - 4. downFlag = 1 일 때 끝이 나면 false를 return
위와 같은 함수를 for문을 통해 모든 열과 행을 집어넣어 true를 반환한 경우에 answer + 1을 한다.
소스코드
package studyGroup.april.april12;
// 골드3
/*
for 문이 끝날 때의 상황을 염두하기
*/
import java.util.*;
import java.lang.*;
import java.io.*;
public class 경사로14890 {
static int n; // 지도의 크기
static int l; // 경사로 길이
static int[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
l = Integer.parseInt(st.nextToken());
int answer = 0;
map = new int[n][n];
for(int i = 0; i < n; i++)
{
st = new StringTokenizer(br.readLine());
for(int j = 0; j < n; j++)
{
map[i][j] = Integer.parseInt(st.nextToken());
}
}
for(int i = 0; i < n; i++)
{
if (checkRow(i) == true)
{
answer += 1;
}
if( checkCol(i) == true)
{
answer += 1;
}
}
System.out.println(answer);
}
// 행, 가로 판단
public static boolean checkRow(int row)
{
int height = map[row][0];
int stack = 0;
int downFlag = 0; // 내리막길 체크
for(int i = 0; i < n; i++)
{
// 높이가 같을 때
if(height == map[row][i])
{
stack += 1;
}
// 높이 차이가 1 이상일 떄 false를 반환
else if(map[row][i] > height + 1 || map[row][i] < height-1 )
{
return false;
}
// 오르막길
else if (map[row][i] == height + 1)
{
// 경사로 설치가 가능할 때
if(stack >= l)
{
height = map[row][i];
stack = 1;
}
else
{
return false;
}
if(downFlag == 1)
{
return false;
}
}
// 내리막길
else if (map[row][i] == height - 1)
{
if(downFlag == 1)
{
return false;
}
height = map[row][i];
downFlag = 1;
stack = 1;
}
if(downFlag == 1 && stack == l)
{
downFlag = 0;
stack = 0;
}
}
if(downFlag == 1)
{
return false;
}
return true;
}
// 열, 세로 판단
public static boolean checkCol(int col)
{
int height = map[0][col];
int stack = 0;
int downFlag = 0; // 내리막길 체크
for(int i = 0; i < n; i++)
{
// 높이가 같을 때
if(height == map[i][col])
{
stack += 1;
}
// 높이 차이가 1 이상일 떄 false를 반환
else if(map[i][col] > height + 1 || map[i][col] < height-1 )
{
return false;
}
// 오르막길
else if (map[i][col] == height + 1)
{
// 경사로 설치가 가능할 때
if(stack >= l)
{
height = map[i][col];
stack = 1;
}
else
{
return false;
}
if(downFlag == 1)
{
return false;
}
}
// 내리막길
else if (map[i][col] == height - 1)
{
if(downFlag == 1)
{
return false;
}
height = map[i][col];
downFlag = 1;
stack = 1;
}
if(downFlag == 1 && stack == l)
{
downFlag = 0;
stack = 0;
}
}
if(downFlag == 1)
{
return false;
}
return true;
}
}