Algorithm/SWEA 알고리즘

SWEA_4014 활주로 건설(자바)

미스터로즈 2021. 4. 19. 19:02

문제 링크

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

이 문제의 경우 구현을 하는 문제입니다.

 

활주로의 경우 가로의 상황과 세로의 상황을 모두 고려해야 하는 문제입니다. 

 

각각의 행과 열에서 가능하면 카운트를 해주면 됩니다.

 

아래의 코드는 행을 처리하는 함수와 열을 처리하는 함수를 따로 구현해서 해결했습니다.

 

아래의 코드처럼 해결하지 않고, 배열을 변형해서 하나의 함수로 처리를 해줄수 있습니다.

package com.Expert;

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

public class Expert_4014 {
	static int N,X;
	static int map[][];
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int testCase = Integer.parseInt(br.readLine());
		
		for (int tc = 1; tc <= testCase; tc++) {
			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("#"+tc+" "+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 makeRoadByRow(int i) {
		int beforeHeight = map[i][0];
		int 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 makeRoadByCol(int i) {
		int beforeHeight = map[0][i];
		int 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;
	}
}

- Step1. 배열에 값을 받아온다.

 

- Step2. 받아온 값을 가지고 행과 열로 나눠서 오르막 설치가 가능한지 판단을 하는 코드를 짠다.