알고리즘 문제 풀이/BOJ
[backjoon]14890 경사로 java
v
2021. 4. 2. 16:00
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
Gold 3이지만 요청 사항 대로 구현만 하면 되는 문제.
1. 가로 세로 별로 새로운 배열을 만든다.
2. 현재 것과 그 다음 것의 높이를 비교한다.
1) 높이가 같다 -> 계속 진행
2) 높이가 2 이상 차이가 난다 -> 경사로를 놓을 수 없음 false 리턴.
3) 높이가 1 차이난다.
오르막인지 내리막인지 구분하여 경사로 길이만큼 놓을 수 있는지 확인한다.
=> 길이에 맞는지, 높이가 맞는지, 이미 놓여있지는 않는지.
(배열 런타임 확인, 높이를 비교, boolean type으로 확인)
package com.example.demo;
import java.io.*;
import java.util.*;
class Main {
static int L ,N;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
L = Integer.parseInt(st.nextToken());
int[][] 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());
}
}
int cnt = 0;
for (int i = 0; i < N; i++) {
int[] road = map[i];
if(isPassing(road)) cnt++;
road = new int[N];
for (int j = 0; j < N; j++) road[j] = map[j][i];
if(isPassing(road)) cnt++;
}
System.out.println(cnt);
}
public static boolean isPassing(int[] road) {
boolean[] flatBlock = new boolean[N];
for (int i = 0; i < N-1; i++) {
int height = road[i+1] - road[i];
if(height == 0) continue;
if(Math.abs(height) > 1) return false;
if(height < 0) {//내리막길
for (int j = i +1; j <= i + L; j++) {
if(j >= N || road[i+1] != road[j] || flatBlock[j]) return false;
flatBlock[j] = true;
}
}else if(height > 0) { // 오르막길
for (int j = i; j > i - L; j--) {
if(j < 0 || road[i] != road[j] || flatBlock[j]) return false;
flatBlock[j] = true;
}
}
}
return true;
}
}
반응형