SWEA 4014 활주로 건설

전재우·2021년 4월 13일
0

구현 전 생각

경사로를 세우려면 X+1의 공간 필요하다,
경사로를 세우면 다음에 나오는 값 -> 현재 값보다 1 커야한다.
배열의 인덱스로 탐색을 하고 인덱스의 값이 x+1개이상 연속되는 경우에 현재 인덱스의 값보다 1큰 값이 나와도 연결가능, 작은 값이 나온경우 이후의 작은 값이 x+1개 이상이면 연결 가능 으로 표시하고 전체 count 를 +1 하는 방법


아쉬운점

코드

package backjoon_4월;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class SWEA_4014_활주로건설 {
	static int N,X;
	static int map[][];

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
		int tc = Integer.parseInt(br.readLine());
		
		for (int t = 1; t <= tc; t++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			X = Integer.parseInt(st.nextToken());
			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());
				}
			}
			System.out.println("#"+t+" "+Process());
		}
	}
	private static int Process() {
		int count=0;
		for (int i = 0; i < N; i++) {
			if(makeRoadByRow(i)) ++count; 
			if(makeRoadByCol(i)) ++count; 
		}
		
		
		
		
		return count;
	}
	private static boolean makeRoadByCol(int i) {
		int beforeHeight = map[i][0], size=0;
		int j=0; //탐색열 위치
		while(j<N) {
			if(beforeHeight==map[i][j]) {
				++size;
				++j;
			}else if(beforeHeight+1 == map[i][j]) {//오르막 경사로 설치 가능한지 판단
				if(size < X) return false;// 경사로 설치 불가
				beforeHeight++;
				size = 1;
				++j;
			}else if(beforeHeight-1 == map[i][j]) {//내리막 경사로 설치 가능한지 판단
				int count=0;
				for (int k = j; k < N; k++) {
					if(map[i][k] != beforeHeight-1) break;
					if(++count==X) break;
				}
				if(count<X) return false; // 경사로 설치 불가
				beforeHeight--;
				size=0;
				j+=X;
				
			}
			else {
				return false;
			}
		}
		return true;

	}
	private static boolean makeRoadByRow(int i) {
		int beforeHeight = map[0][i], size=0;
		int j=0; //탐색열 위치
		while(j<N) {
			if(beforeHeight==map[j][i]) {
				++size;
				++j;
			}else if(beforeHeight+1 == map[j][i]) {//오르막 경사로 설치 가능한지 판단
				if(size < X) return false;// 경사로 설치 불가
				beforeHeight++;
				size = 1;
				++j;
			}else if(beforeHeight-1 == map[j][i]) {//내리막 경사로 설치 가능한지 판단
				int count=0;
				for (int k = j; k < N; k++) {
					if(map[k][i] != beforeHeight-1) break;
					if(++count==X) break;
				}
				if(count<X) return false; // 경사로 설치 불가
				beforeHeight--;
				size=0;
				j+=X;
				
			}
			else
				return false;
		}
		return true;
	}
	
	
}

profile
코린이

0개의 댓글