본문 바로가기

Algorithms/Baekjoon

[Java] 백준 알고리즘 14890번 문제 : 삼성 SW 역량 테스트 기출 문제 - 경사로 (Simulation, 시뮬레이션)

--- 문제 ---

 

 

 

--- 코드 ---

 

행마다 , 열마다 다음 조건에 맞춰서 검사를 진행해주면 된다.

 

1. 이전 숫자 - 다음 숫자를 구한다

  1-1. 차이가 -1 이면 다음 숫자가 작은 것이므로, 앞으로 이 작은 숫자가 L-1 개가 더 나와야 함 (chekc = L-1) check 가 0이 안되면 못가는 걸로 결론

  1-2. 차이가 1 이면 다음 숫자가 큰 것이므로, 지금까지 이전 숫자가 L가 이상 나왔는지 확인 (path>=L) 안나왔으면 길 못가는 걸로 결론

  1-3. 차이가 0 이면 이전 숫자의 길이 늘어난 것이므로 길 추가 (++path)

  1-4. 차이가 -1 보다 작거나 1보다 큰 경우, 경사로를 못 놓으므로 길 못 가는 걸로 결론 짓기 

 

2. 그 행 혹은 열이 결국 지나가는 게 가능하다고 결론 나면, 가능 경로 추가 (++cnt)

 

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

public class Bj14890 {
	public static int N,L,cnt, check, path;
	public static int[][] map;
	public static boolean possible;
	
	public static int stoi(String s) {
		return Integer.parseInt(s);
	}
	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		N = stoi(st.nextToken());
		L = stoi(st.nextToken());
		
		map = new int[N][N];
		cnt = 0;
		
		for(int i=0; i<N; ++i) {
			check = 0;
			path = 0;
			possible = true;
			st = new StringTokenizer(br.readLine());
			
			for(int j=0; j<N; ++j) {
				int tmp  = stoi(st.nextToken());
				map[i][j]= tmp; 
				// first
				if(j==0) {
					path=1; continue;
				}
				int pre = map[i][j-1];
				if(possible) {
					checkPossible(pre,tmp,j);
				}
			}
			if(possible && check==0) {
				++cnt;
			}
		}
		
		for(int i=0; i<N; ++i) {
			check = 0;
			path = 0;
			possible = true;
			
			for(int j=0; j<N; ++j) {
				int tmp = map[j][i];
				// first
				if(j==0) {
					path=1; continue;
				}
				int pre = map[j-1][i];
				if(possible) {
					checkPossible(pre,tmp,j);
				}
			}
			if(possible && check==0) {
				++cnt;
			}
		}
		
		System.out.println(cnt);
		
	}
	
	public static void checkPossible ( int pre, int tmp, int j ) {
		if(check>0) {
			if(pre!=tmp) {
				possible = false;
			}
			else {
				--check;
			}
		}
		else {
					
			if(pre==tmp) {
				++path;
			}
			else if(pre-tmp==1) {
				check = L - 1;
				path = 0;
			}
			else if(pre-tmp==-1) {
				if(path>=L) {
					path = 1;
				}
				else {
					possible =false;
				}
			}
			else {
				possible = false;
			}
		}
	}
}

 

--- 출처 ---

 

www.acmicpc.net/problem/14890

 

14890번: 경사로

첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.

www.acmicpc.net

 

반응형