문제 : https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
문제 요약 : 지도에서 경사로를 사용해 지나갈 수 있는 길의 개수 출력
입력 | 출력 |
2 ≤ N(크기) ≤ 100 1 ≤ [N][N](높이) ≤ 10 1 ≤ L(경사로길이) ≤ N |
경사로를 이용해 갈 수 있는 길의 개수 |
JAVA
채점 번호 | 아이디 | 문제 번호 | 결과 | 메모리 | 시간 | 언어 | 코드 길이 |
16366827 | cbkpar | 14890 | 맞았습니다!! | 14060KB | 96ms | Java | 1692B |
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n,l,i,j;
String str = "";
str = br.readLine();
String[] arr = str.split(" ");
n = Integer.parseInt(arr[0]);
l = Integer.parseInt(arr[1]);
int[][] map = new int[n][n];
for(i=0;i<n;i++) {
str = br.readLine();
arr = str.split(" ");
for(j=0;j<n;j++) {
map[i][j] = Integer.parseInt(arr[j]);
}
}
int path = 0;
//왼쪽 위에서 아래 순서로 왼쪽에서 오른쪽으로 갈 수 있는지 확인
for(i=0;i<n;i++) {
int p = 1; //0번은 검사할 필요 없기 때문에 1번부터 검사
int q = map[i][0]; // 저장된 높이
int r = 1; // 검사해온곳까지 경사로를 놓을 수 있는 길이
while(p<n) {
if(map[i][p]==q) { // 높이가 같다면
p++; // 다음블럭 검사
r++; // 경사로 놓을 수 있는 길이 1증가
continue;
}else if(map[i][p]==q+1) { //블럭이 현재까지 검사해온 블럭보다 1칸 높다면
if(r<l) break; // 블럭을 놓을 수 없으면 종료
q=map[i][p]; // 저장해온 블럭 높이 수정
r=1; // 놓을 수 있는 경사로 길이 1로 수정
p++; // 다음 블럭 검사
continue;
}else if(map[i][p]==q-1) { //블럭이 현재까지 검사해온 블럭보다 1칸 낮다면
int tmppath=1; // 경사로를 놓을 수 있는지 확인 초기 1칸
for(j=1;j<l;j++) {
if(p+j>=n) break; // 지도 범위보다 초과하면 종료
if(map[i][p]!=map[i][p+j]) break; //높이가 다르다면 종료
if(map[i][p]==map[i][p+j]) tmppath++; // 높이가 같으면 1칸 증가
}
if(tmppath<l) break; // 경사로를 놓을 수 없다면 종료
p+=l; //경사로를 놓은 후 l블럭 다음부터 검사
q=map[i][p-1];
r=0; // 내려왔기때문에 그자리에 블럭을 놓을 수 없어서 경사로 길이0으로 초기화
continue;
}
break;
}
if(p==n) path++; // 끝까지 건너 왔다면 길을 1개 증가
}
//위 왼쪽에서 오른쪽 순서로 위에서 아래로 갈 수 있는지 확인
for(i=0;i<n;i++) {
int p = 1;
int q = map[0][i];
int r = 1;
while(p<n) {
if(map[p][i]==q) {
p++;
r++;
continue;
}else if(map[p][i]==q+1) {
if(r<l) break;
q=map[p][i];
r=1;
p++;
continue;
}else if(map[p][i]==q-1) {
int tmppath=1;
for(j=1;j<l;j++) {
if(p+j>=n) break;
if(map[p][i]!=map[p+j][i]) break;
if(map[p][i]==map[p+j][i]) tmppath++;
}
if(tmppath<l) break;
p+=l;
q=map[p-1][i];
r=0;
continue;
}
break;
}
if(p==n) path++;
}
System.out.println(path); // 가능한 길의 개수 출력
}
}
'백준온라인' 카테고리의 다른 글
[백준온라인] 15683번 감시 (0) | 2019.12.06 |
---|---|
[백준온라인] 14891번 톱니바퀴 (0) | 2019.12.06 |
[백준온라인] 14503번 로봇 청소기 (0) | 2019.12.04 |
[백준온라인] 14502번 연구소 (0) | 2019.12.04 |
[백준온라인] 14501번 퇴사 (0) | 2019.12.04 |