본문 바로가기
Python3/백준 알고리즘

2022.05.18 [백준] (python 파이썬) 경사로

by ian's coding 2022. 5. 18.
728x90
반응형

 

 

 

 

 

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

 

14890번: 경사로

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

www.acmicpc.net

 


풀이

아래 코드는 하드코딩으로 작성해서 알아보기 힘들 수도 있다....

우선 해당 열, 행이 지나갈 수 있는 길인지 체크하기 위한 ch를 True로 설정했다.

그리고 같은 칸의 개수를 세기위한 cnt변수, 각 라인에서 경사로를 설치했는지를 체크하기 위한 ch_runway배열을 선언했다.

이후, 가로를 체크하는 for문이 돈다.

1. 만약 j 값과 j+1 값이 같고 ch_runway[j+1]=False (j+1의 칸에 경사로를 설치하지 않았으면) cnt를 증가시켰다.

 

2. j 값과 j+1 값의 차이가 절대값 1이 아니면 ch=False를 해준다음 break를 이용해 해당 for문을 빠져나왔다.

   여기서 ch를 False로 바꾼 이유는 해당 길은 갈 수 없기 때문이다.

 

3. j값과 j+1값의 차이가 -1이면 지나왔던 길에 경사로를 설치해야하기 때문에 cnt값이 L값보다 크거나 같으면 cnt=1로     설정했다.( 이유는 경사로를 설치해서 다음 블럭으로 넘어갔기 때문에 블럭의 수를 현재 밟고있는 칸을 다시                 처음으로 생각한다.) 

   cnt<L이면  ch=False로 바뀐 뒤 break를 이용해 빠져나온다. (cnt가 L보다 작으면 경사로를 설치할 수 없기 때문에 갈     수 없다.)

 

4. j값과 j+1값의 차이가 1이면 지나가야 할 길에 경사로를 설치해야한다. 그래서 먼저 if N-j-1<L: 조건을 이용해 만약       남은 길과 경사로의 길이를 비교해 경사로의 길이가 길면 역시 ch=False로 바꾸고 break를 했다.

   그리고 경사로를 설치할 수 있는 길을 세기위해 cnt_next를 1로 설정했다. (이유는 다음칸을 포함했기 때문)

   그리고 경사로를 설치해야할 칸의 값을 cur_num에 저장했다.

   이후 j+1칸에 경사로를 설치했는지 확인 후, 설치하지 않았다면 ch_runway[j+1]값을 True로 바꾼 뒤, 그 다음칸부터       경사로를 설치해야하는 칸까지 for문을 통해 확인했다.

   모든 경우를 확인 후 ch=True면 load_cnt를 증가시켰다.

 

5. 세로길의 방법은 가로길의 방법과 동일하다.

 

나중에 더 간단하고 보기 좋게 코드를 다시 짜야할거같다...

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
N, L=map(int, input().split())
arr=[]
for _ in range(N):
    arr.append(list(map(int,input().split())))
 
load_cnt=0
for i in range(N):
    ch=True
    cnt=1
    ch_runway=[False]*N
    for j in range(N-1):
        if arr[i][j]==arr[i][j+1]:
            if not ch_runway[j+1]:
                cnt+=1
 
        elif abs(arr[i][j]-arr[i][j+1])!=1:
            ch=False
            break
 
        elif arr[i][j]-arr[i][j+1== -1:
            if cnt >= L:
                cnt = 1
            else:
                ch = False
                break
 
        elif arr[i][j]-arr[i][j+1== 1:
            if N - j - 1 < L:
                ch = False
                break
            cnt_next = 1
            cur_num = arr[i][j + 1]
            if ch_runway[j+1]:
                ch=False
                break
            else:
                ch_runway[j+1]=True
            for k in range(j + 2, j + 1 + L):
                if cur_num == arr[i][k]:
                    cnt_next += 1
                    if ch_runway[k]:
                        ch=False
                        break
                    else:
                        ch_runway[k] = True
            if L == cnt_next:
                cnt = 0
            else:
                ch = False
                break
    if ch:
        load_cnt+=1
 
    ch=True
    cnt=1
    ch_runway = [False* N
    for j in range(N - 1):
        if arr[j][i] == arr[j+1][i]:
            if not ch_runway[j+1]:
                cnt += 1
 
        elif abs(arr[j][i] - arr[j+1][i]) != 1:
            ch = False
            break
 
        elif arr[j][i] - arr[j+1][i]==-1:
            if cnt >= L:
                    cnt = 1
            else:
                ch = False
                break
 
        elif arr[j][i] - arr[j + 1][i] == 1:
            if N-j-1<L:
                ch=False
                break
            cnt_next=1
            cur_num=arr[j + 1][i]
            if ch_runway[j+1]:
                ch=False
                break
            else:
                ch_runway[j+1]=True
            for k in range(j+2,j+1+L):
                if cur_num==arr[k][i]:
                    cnt_next+=1
                    if ch_runway[k]:
                        ch=False
                        break
                    else:
                        ch_runway[k] = True
            if L==cnt_next:
                cnt=0
            else:
                ch=False
                break
 
    if ch:
        load_cnt += 1
print(load_cnt)
cs

 

 

 

 

728x90
반응형

댓글