https://www.acmicpc.net/problem/14890
14890번: 경사로
첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다.
www.acmicpc.net
package Main; import java.util.Scanner; public class Main { public static int N,L; public static int[][] map; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N=sc.nextInt(); L=sc.nextInt(); map = new int[N][N]; for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { map[i][j] = sc.nextInt(); } } int count = 0; for(int i=0;i<N;i++) { if(calRow(i)) count++; //i번째 열 확인 if(calCol(i)) count++; //i번째 열 확인 } System.out.println(count); } //이런 문제의 핵심은 안되는 경우가 잇을경우를 먼저 지워주는 것 //높이차 1일때 false return //또한 계단문제에서 변화가 발생하는것은 계단의 높이가 다음계단과 차이점이 있을때 이벤트가 발생하는것이다. public static boolean calRow(int row) { boolean[] isIncline = new boolean[N]; //경사면 설치여부 확인 for(int i=0;i<N-1;i++) { int diff = map[row][i] - map[row][i+1]; //if(diff == 1) continue; if(diff > 1 || diff < -1) return false; //높이차 1 초과하므로 false else if(diff == -1) { //다음계단이 한계단 높은 경우 for(int j=0; j<L; j++) { //올라가는 경사로를 설치할 수 있는지 확인 if( i-j < 0 || isIncline[i-j]) return false; if(map[row][i] != map[row][i-j]) return false; isIncline[i-j] = true; } } else if(diff == 1) { //다음계단이 한계단 낮다 for(int j=1;j<=L;j++) { if( i+j >= N || isIncline[i+j]) return false; if(map[row][i] -1!= map[row][i+j]) return false; isIncline[i+j] = true; } } } return true; } public static boolean calCol(int col) { boolean[] isIncline = new boolean[N]; //경사면 설치여부 확인 for(int i=0;i<N-1;i++) { int diff = map[i][col] - map[i+1][col]; //if(diff == 1) continue; if(diff > 1 || diff < -1) return false; else if(diff == -1) { for(int j=0;j<L;j++) { if( i-j <0 || isIncline[i-j]) return false; if(map[i][col] != map[i-j][col]) return false; isIncline[i-j] = true; } } else if(diff==1) { for(int j=1;j<=L;j++) { if(i+j >=N || isIncline[i+j]) return false; if(map[i][col] -1!= map[i+1][col]) return false; isIncline[i+j]= true; } } } return true; } }
이문제에서 느낀점은 너무 다 생각하지말고 일단 문제에 있는것만 구현하는것입니다.
이런 문제의 핵심은 안되는 경우가 잇을경우를 먼저 지워주는 것
높이차 1일때 false return
또한 계단문제에서 변화가 발생하는것은 계단의 높이가 다음계단과 차이점이 있을때 이벤트가 발생하는것입니다.
'알고리즘 > 삼성SW' 카테고리의 다른 글
[삼성 SW 역량 테스트 기출 문제] 주사위 굴리기 2 - 레벨1 (0) | 2022.07.05 |
---|---|
[삼성 SW 역량 테스트 기출 문제] 마법사 상어와 비바라기 - 레벨1 (0) | 2022.07.04 |
[삼성 SW 역량 테스트 기출 문제] 마법사 상어와 토네이도 - 레벨1 (0) | 2022.07.02 |
[삼성 SW 역량 테스트 기출 문제] 미세먼지 안녕! - 레벨1 (0) | 2022.04.26 |
[삼성 SW 역량 테스트 기출 문제] 드래곤 커브 - 레벨1 (0) | 2022.04.05 |