swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeW7FakkUDFAVH
어렵지 않은 삼성 모의 SW역량테스트 문제였다.
문제 푸는 데 1시간 정도 소요.
가로(행) 탐색, 세로(열)의 모든 케이스를 check_slope 함수에 넣어 가능하면 1, 불가능하면 0 리턴.
check_slope () 함수에서
- 같은 높이이면 cnt += 1
- 높이 1 높아질 때, 그동안의 쌓아온 거리가 경사로 길이보다 크거나 같다면 가능한 경우이므로 cnt = 1로 초기화
- 높이 1 낮아질 때, 현재 쌓아온 거리가 0보다는 크거나 같다면 현재 쌓아온 거리를 음수 값으로 땡겨주어 경사로 길이만큼 같은 높이를 유지할 때 경사로를 설치할 있도록 함. cnt = -X + 1
- 높이 2 이상 차이나면 경사로 건설할 수 없는 경우이므로 리턴 0
리턴한 값들을 result에 넣어주며 tc별 result 값 출력
파이썬 코드는 다음과 같다.
def check_slope(row):
cnt = 1
for i in range(1, N):
if row[i] == row[i-1]: # 같은 높이라면
cnt += 1
elif row[i] - row[i-1] == 1 and cnt >= X: # 높이 1 높아지면
cnt = 1
elif row[i-1] - row[i] == 1 and cnt >= 0: # 높이 1 낮아지면
cnt = -X + 1
else: # 높이 2 이상 차이나면
return 0
if cnt >= 0:
return 1
return 0
# main
T = int(input())
for tc in range(T):
N, X = map(int, input().split())
A = []
result = 0
for i in range(N):
A.append(list(map(int, input().split())))
result += check_slope(A[i])
for i in range(N):
temp = []
for j in range(N):
temp.append(A[j][i])
result += check_slope(temp)
print("#{} {}".format(tc+1, result))
# 1 7
# 2 4
# 3 11
# 4 11
# 5 15
# 6 4
# 7 4
# 8 1
# 9 5
# 10 8
* 고찰 : 여러 번 풀어본 문제지만 풀 때마다 높이 1 낮아지는 부분은 항상 헷갈린다. 잘 따져주어 코드로 옮기는 것이 중요하다. 오늘도 Keep Going.
참고로 이 문제는 백준 사이트의 삼성기출문제집에 있는 14890 - 경사로(www.acmicpc.net/problem/14890) 문제와 완전 같은 문제이다. 풀이도 완전히 동일하다.
'Problem Solving > swea' 카테고리의 다른 글
[SWEA] 2383. 점심 식사시간(Python) / DFS (0) | 2021.03.07 |
---|---|
[SWEA] 4013. 특이한 자석(Python) / DFS (0) | 2021.03.07 |
[SWEA] 5644. 무선 충전(Python) / BFS + Simulation (0) | 2021.03.07 |
[SWEA] 1953. 탈주범 검거 (Python) / BFS (0) | 2021.02.25 |
[SWEA]1949. 등산로 조성(Python) / DFS (0) | 2021.02.23 |