알고리즘 문제 풀이/BOJ

[backjoon]14890 경사로 java

v 2021. 4. 2. 16:00

www.acmicpc.net/problem/14890

 

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;
	}
	
}
반응형