끄적끄적 코딩
article thumbnail
Published 2023. 1. 30. 19:49
[Java] 백준 14890번 경사로 알고리즘

각 위치에 높이가 주어지고 가로 세로로 이동 가능한 경우의 수를 구하는 문제입니다.
높이가 같은 곳끼리 이동할 수 있으며 길이 l의 경사로를 설치할 수 있습니다.
경사로를 쌓기위해서는 높이 차이가 1이 나야하고 경사로를 쌓기 위한 l만큼의 공간이 필요합니다.

경사로를 설치해서 해당 길을 이동할 수 있는지 찾고 가능한경우를 카운팅해서 출력해주었습니다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int l = Integer.parseInt(st.nextToken());
		int[][] map = new int[n][n];
		int ans = 0;
		boolean down = false;
		boolean chk = false;
		
		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) {
			int cnt = 0;
			int compare = map[i][0];
			down = false;
			chk = false;
			for(int j=0; j<n; ++j) {
				if(compare == map[i][j]) {
					++cnt;
					if((cnt >= l-1) && down) {
						down = false;
						cnt = 0;
					}
				} else if(compare == map[i][j] + 1) { // down
					if(l!=1 && down) {
						chk = true;
						break;						
					}
					cnt = 0;
					compare = map[i][j];
					down = true;
				} else if(compare == map[i][j] - 1) { // up
					if(down) {
						chk = true;
						break;
					}
					if(l!=1 && cnt < l) {
						chk = true;
						break;
					}
					compare = map[i][j];
					cnt = 1;
				} else {
					chk = true;
					break;
				}
			}			
			if(!chk && (!down || l == 1)) {
				++ans;
			}
		}
		for(int j=0; j<n; ++j) {
			int cnt = 0;
			int compare = map[0][j];
			down = false;
			chk = false;
			for(int i=0; i<n; ++i) {
				if(compare == map[i][j]) {
					++cnt;
					if((cnt >= l-1) && down) {
						down = false;
						cnt = 0;
					}
				} else if(compare == map[i][j] + 1) { // down
					if(l!=1 && down) {
						chk = true;
						break;						
					}
					cnt = 0;
					compare = map[i][j];
					down = true;
				} else if(compare == map[i][j] - 1) { // up
					if(down) {
						chk = true;
						break;
					}
					if(l!=1 && cnt < l) {
						chk = true;
						break;
					}
					compare = map[i][j];
					cnt = 1;
				} else {
					chk = true;
					break;
				}
			}			
			if(!chk && (!down || l == 1)) {
				++ans;
			}
		}
		System.out.println(ans);
	}
}

'알고리즘' 카테고리의 다른 글

[Java] 백준 16236번 아기 상어  (0) 2023.02.02
[Java] 백준 14499번 주사위 굴리기  (0) 2023.02.01
[Java] 백준 12100번 2048 (Eazy)  (0) 2023.01.30
[Java] 백준 3190번 뱀  (0) 2023.01.29
[Java] 백준 14502번 연구소  (0) 2023.01.26

검색 태그