'삼성 SW 역량 테스트' 기출 문제 입니다. 😀
문제 👉 14890번: 경사로
1. 문제
- 크기가 N*N인 지도의 각 칸에는 높이가 적혀있다.
- 지도의 길은 N개의 행과 N개의 열로 총 2N개이다.
- 길을 지나기 위해서는 길에 속한 모든 칸의 높이가 같거나 경사로를 놓아야 한다.
- 경사로 조건은 다음과 같다.
- 경사로는 낮은 칸에 놓으며, L개의 연속된 칸에 경사로의 바닥이 모두 접해야 한다.
- 낮은 칸과 높은 칸의 높이 차이는 1이어야 한다.
- 경사로를 놓을 낮은 칸의 높이는 모두 같아야 하고, L개의 칸이 연속되어야 한다.
- 유효한 길의 개수를 출력한다.
2. 풀이
시뮬레이션
을 이용한 문제 풀이
- 경사로는 반드시 1 -> 앞 뒤 차이가 2 이상이면 불가
- 길의 확인 방향은 계산하기 쉽게 행은 동쪽, 열은 남쪽
- 오르막은 이전에 연속된 낮은 칸의 유무를 바로 확인
- 내리막은 이후에 연속된 낮은 칸의 유무를 순차적으로 확인
3. 코드
N, L = map(int ,input().split())
arr = [list(map(int, input().split())) for _ in range(N)]
ret = 0
def solution():
global ret
def slope(i, d):
global ret
cnt = 1 # 연속된 칸의 개수
for j in range(N-1):
v = arr[i][j+1] - arr[i][j] if d else arr[j+1][i] - arr[j][i]
if v == 0:
cnt += 1
elif v == 1 and cnt >= L: # 오르막은 낮은 칸이 L개 이상인지 바로 확인 가능
cnt = 1 # L개 이상이면 연속된 칸의 개수를 1로 초기화
elif v == -1 and cnt >= 0: # 내리막은 낮은 칸의 개수를 바로 확인 불가능
cnt = 1-L # 내리막 초반에 연속된 칸의 개수를 음수로 변경
else:
return
if cnt >= 0:
ret += 1
for i in range(N):
slope(i, 1)
slope(i, 0)
return ret
print(solution())
- 결과는 72 ms 나왔다.
References
🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋
'Coding Test > BOJ' 카테고리의 다른 글
[백준] 14891 - 톱니바퀴 [Python(파이썬)] (0) | 2021.11.22 |
---|---|
[백준] 14889 - 스타트와 링크 [Python(파이썬)] (0) | 2021.11.22 |
[백준] 14888 - 연산자 끼워넣기 [Python(파이썬)] (0) | 2021.11.22 |
댓글