공부공간

BOJ - 14890 ) 경사로 본문

알고리즘/구현,시뮬

BOJ - 14890 ) 경사로

개발자가될수있을까? 2020. 2. 7. 00:22


https://www.acmicpc.net/problem/14890

 

14890번: 경사로

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

www.acmicpc.net


배열을 전진하면서 경사로를 놓을수 있는지 없는지 테스트하는 문제이다.

 

문제는 간단하다. 길이 L인 경사로로 높이가 1차이나는 경우를 연결할 수있다.

 

연결되면 계속 진행하여서 한 행의 끝까지 도달하면 answer를 증가시킨다.

 

길이 L의 경사로를 사용했다는 visit 배열을 사용해서 경사로를 놓을떄 놓을수 있는지 없는지 확인하면서 진행하였다.

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package practice;
 
 
public class 경사로 {
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int L = Integer.parseInt(st.nextToken());
        int answer =0;
        int map[][] = new int[2*N][N];
        
        for(int y=0;y <N ;y++) {
            st = new StringTokenizer(br.readLine());
            for(int x= 0; x< N; x++) {
                map[y][x] = Integer.parseInt(st.nextToken());
            }
        }
        int copy[][] = new int[N][N];
        // 기존 배열을 90도 회전시켜 배열 아래에 붙여서 행의 값만 증가시켜서 한번에 확인한다.
        for(int y=0;y <N ;y++) {
            for(int x= 0 , i = N-1; x< N; x++ , i--) {
                map[N+y][x] = map[i][y];
            }
        }
        
        for(int y = 0 ; y < 2*N ; y++) {
            boolean visit[] = new boolean[N]; boolean can = true;
            int now =map[y][0];
            top:
            for(int x=1; x < N ; x++) {
                if(map[y][x]==now) continue;
                if(now+1 < map[y][x] || now-1 > map[y][x]) {
                    can = falsebreak top;
                }
                if(now+1 == map[y][x]) {
                    //오르막 경사
                    if(x-<0) {
                        can = falsebreak top;
                    }// 범위를 벗어난 경우
                    for(int k = x -L ; k < x;k++) {
                        if(now != map[y][k] || visit[k]) {
                            can = falsebreak top;
                        }
                    }
                    // 이전에 사용했던 경우
                    if(can) {
                        for(int k = x -L ; k < x;k++) {
                            visit[k] = true;
                        }
                        now = map[y][x];
                    // 경사로를 놓는다.
                    }
                }
                if(now-1== map[y][x]) {
                    if(x+L-1 >=N) {
                        can =false;break top;
                    }
                    for(int k = x+1 ; k < x+L;k++) {
                        if(map[y][x] != map[y][k] || visit[k]) {
                            can = falsebreak top;
                        }
                    }
                    if(can) {
                        for(int k = x ; k < x+L;k++) {
                            visit[k] = true;
                        }
                        now = map[y][x];
                    }
                }
            }
            if(can) answer++;
        }
        System.out.println(answer);
    }
 
}
 
 
 
 
 
 

'알고리즘 > 구현,시뮬' 카테고리의 다른 글

SWEA ) 대관이의 대량할인  (0) 2020.02.09
SWEA ) 줄기세포 배양  (2) 2020.02.09
Jungol - 1141 ) 불쾌한 날(Bad Hair Day)  (0) 2020.02.03
BOJ - 2798 ) 블랙잭  (0) 2020.01.28
BOJ - 1966 ) 프린터 큐  (0) 2020.01.27
Comments