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 |
'Python3 > 백준 알고리즘' 카테고리의 다른 글
2022.05.31 [백준] (python 파이썬) 친구 네트워크 (0) | 2022.05.31 |
---|---|
2022.05.17 [백준] (python 파이썬) 아기 상어 (0) | 2022.05.17 |
2022.05.16 [백준] (python 파이썬) 달팽이 (0) | 2022.05.16 |
2022.05.09 [백준] (python 파이썬) 가장 가까운 공통 조상 (0) | 2022.05.09 |
2022.05.09 [백준] (python 파이썬) 트리의 부모 찾기 (0) | 2022.05.09 |
댓글