일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 감소하는 수
- 스타트 택시
- QueryDSL 기초
- 미세먼지 안녕!
- 2020 카카오 인턴십
- HTML 기초
- 19238번
- SW Expert Academy
- python
- 1038번
- 어른 상어
- 수식 최대화
- 경주로 건설
- 파이썬
- 백준 알고리즘
- 1789번
- 거울 설치
- 16234번
- 키패드 누르기
- 프로그래머스
- 17144번
- 12869번
- 15686번
- 14499번
- 보석 쇼핑
- 베스트엘범
- 9095번
- 12865번
- SW ExpertAcademy
- 빛의 경로 사이클
Archives
- Today
- Total
보물창고 블로그
SW Expert Academy 4014. [모의 SW 역량테스트] 활주로 건설 본문
728x90
문제 링크:https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeW7FakkUDFAVH
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
이 문제의 핵심은 리스트 한 줄을 활주로 건설이 가능한지 아닌지를 판단하는 문제이다. 내가 생각한 핵심 구현 내용은 활주로 건설 여부이다. 먼저 리스트 1줄을 받았을 때, 이 리스트에서 활주로 건설이 가능한지 아닌지를 판별하는 함수를 구현하기로 하였다. 나는 이 함수를 check라는 이름의 함수로 구현하였다. 먼저 1칸씩 전진하면서 한 칸 앞의 높이값과 비교하여서 차이가 1 이상이면 경사로를 설치할 수 없으므로 False를 반환하게 하였고, 만약 높이값이 같다면 통과하고 만약 차이가 1이라면 앞칸이 높은지 뒷칸이 높은 지를 판별하여서 경사로 길이만큼 탐색하여서 설치할 수 있으면 넘어가고 만약 설치할 수 없거나 경사로가 설치되어있다면 False를 반환하게 하였다. 이후 절벽 지대를 행별로, 열 별로 탐색해야 하므로 열을 탐색할 때는 절벽 지대를 90도 회전하여서 map2라는 리스트에 넣어서 탐색하였다. 아래는 나의 풀이 코드이다.
def check(list1, x):
n = len(list1)
construct = [0 for _ in range(n)]
result = True
for i in range(n-1):
a1 = list1[i]
a2 = list1[i+1]
if abs(a1-a2) > 1:
result = False
break
elif a1 == a2:
continue
else:
if a1 > a2:
flag1 = 0
if i+1+x > n:
result = False
break
else:
for j in range(i+1, i+1+x):
if list1[j] != a2 or construct[j] == 1:
flag1 = 1
break
if flag1 == 1:
result = False
break
else:
for j in range(i+1,i+1+x):
construct[j]=1
elif a2 > a1:
flag2 = 0
if i-x < -1:
result = False
break
else:
for j in range(i, i-x, -1):
if list1[j] != a1 or construct[j]==1:
flag2 = 1
break
if flag2==1:
result=False
break
else:
for j in range(i,i-x,-1):
construct[j]=1
return result
t = int(input())
for test in range(1, t+1):
n, x = map(int, input().split())
count=0
map1 = []
for _ in range(n):
map1.append(list(map(int, input().split())))
map2=[]
for i in range(n):
list2=[]
for j in range(n-1,-1,-1):
list2.append(map1[j][i])
map2.append(list2)
for i in range(n):
if check(map1[i],x)==True:
count+=1
if check(map2[i],x)==True:
count+=1
print('#{} {}'.format(test,count))
'알고리즘 풀이 > SW Expert Academy' 카테고리의 다른 글
SW Expert Academy 1824. 혁진이의 프로그램 검증 (0) | 2020.01.28 |
---|---|
SW Expert Academy 4130. [모의 SW 역량테스트] 특이한 자석 (0) | 2020.01.23 |
SW Expert Academy 1868. 파핑파핑 지뢰찾기 (0) | 2020.01.16 |
SW Expert Academy 2819 격자판의 숫자 이어 붙이기 (0) | 2020.01.16 |
SW Expert Academy 1961 숫자 배열 회전 (0) | 2020.01.03 |
Comments