티스토리 뷰

PS

백준 14890. 경사로

tose33 2022. 4. 16. 14:41

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

 

14890번: 경사로

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

www.acmicpc.net

 

주어지는 지도에서 각 행과 열의 시작과 끝까지 도달할수  있는지 판단하는 문제다.

기본적으로 같은 높이어야 이동할수 있지만, 높이가 1차이라면 경사로를 깔아서 갈 수 있다.

그런데 예외 조건들이 좀 많아서 까다로웠다.

 

우선 각 행과, 열 별로 계산해야 하기 때문에 햇갈리지 않도록 각 행들과 열들을 하나의 벡터로 만들어서 계산했다.

결국 총 2N개의 벡터가 생기는 셈이다.

 

이제 하나의 길을 기준으로 판단하면 된다.

나는 우선 길에서 가장 높은 지점을 찾고 그 지점에서 부터 내려가면서 양쪽 끝 지점까지 이동할수 있는지 판단했다.

 

line[]: 

idx: 0 1 2 3 4 5
lv: 1 1 1 2 2 2

경사로의 길이 L=2라고 했을때, 위 길을 기준으로 판단하면 가장 높은 지점의 인덱스는 3이다. 

이 지점부터 오른쪽 끝, 왼쪽 끝으로 이동할수 있는지 판단하면 되는데 같은 높이면 그냥 이동하면 된다.

따라서 오른쪽은 끝 까지 이동 할수 있다.

 

왼쪽은 line[2]가 1이기 때문에 2보다 작다. 따라서 경사로를 설치할수 있는지를 판단해야 하는데 [2]와 [1]이 같은 레벨인지 판단해서 같은 레벨이라면 경사로를 깔고 이동하면 된다. [2],[1]인 이유는 L=2이기 때문이다. 

[2],[1]이 레벨 1로 같기 때문에 경사로를 깔고 이동하면 왼쪽도 끝지점 까지 이동이 가능한것을 알 수 있다.

 

따라서 이 길은 처음부터 끝까지 이동 가능하다.

 

 

오르막길이 있는 경우

위와 같은 경우만 있다면 좋았겠지만 내리막길이 아닌 오르막길이 있는 경우도 있다.

다음과 같은 길을 보면 

 

line[]:

idx: 0 1 2 3 4 5
lv: 3 3 2 2 3 3

가장 높은 지점은 [0]의 3이다. 

이 지점은 왼쪽 끝이므로 왼쪽은 탐색할 필요 없고 오른쪽으로 탐색을 시작하면 된다.

우선 [1]은 같은 레벨이므로 그냥 이동. 

[1]에서 다음인 [2]를 보니 내리막길이고 [2],[3]이 같은 레벨이라 경사로를 깔고 내려가면 된다.

그러면 [1] += 2 = [3]에 도착한다. 

 

그런데 [3]에서 다음 지점인 [4]를 보니 레벨이 3이다. 즉 오르막길인데, 내리막길은 이동 못하는 지점에서 경사로를 깔수 있는지 판단하고 그냥 깔고 내려가면 됐지만, 오르막길을 그렇지 않다는 것을 알 수 있다.

따라서 이럴 경우 이전 지점들을 되돌아봐서 오르막길 경사로를 설치할수 있었는지 확인을 해야 한다.

현재지점 [3]과 [2]를 보면 같은 레벨이므로 [2]에서 부터 오르막길을 설치했다면 [2],[3]에 경사로가 설치되 [4]까지 이동이 가능하다.

 

그런데 우리는 [1]에서부터 [2],[3]에 내리막길 경사로를 설치하고 내려왔으므로 이는 불가능하다. 

따라서 경사로를 설치할때 경사로를 설치했는지 여부를 기록할수 있는 bool 형 배열에 기록하고, 오르막길을 맞딱 뜨렸을때 현재 지점 포함 이전 L개의 길들을 되돌아 보며 같은 레벨이고 && 경사로가 설치되어있지 않으면 다음 지점으로 이동할수 있는 것이다.

 

 

 


추가:

이후에 다른 분들 코드를 봤는데, 오르막길을 설치할수 있는지 판단하는 부분이 더 좋은 방법이 있었다.

나는 오르막길을 설치할수 있는지 판단하기 위해 이전 길들을 되돌아 봤는데 이때 O(L) 만큼의 시간이 소모된다.

그런데 변수 하나를 선언하고 같은 레벨의 땅까리 이동할때 이 변수 값을 1씩 증가시켜 주면, 오르막길을 맞딱 뜨렸을때 이 변수값이 경사로의 길이보다 크거나 같다면 오르막길을 설치할수 있는 평지가 이전에 있었던 것이므로 오르막길을 설치후 이동하면 된다. 

이렇게 하면 내가 했던것 처럼 L만큼 반복문을 더 안돌아도 되고, bool형 배열을 선언하지 않아도 된다.

 

그리고 다 짜고 나서 알았는데 생각해보니 가장 큰 값에서 왼쪽, 오른쪽 끝까지 갈 수 있는지 판단하지 않고 그냥 왼쪽 끝에서 시작해도 될것 같다. 처음에 생각했을때 오르막길을 생각안하고 짜다가 중간에 깨달아서 이렇게 되버렸는데 그냥 왼쪽 끝에서 부터 오르막길, 내리막길 설치 가능 한지 판단하면 될듯.

'PS' 카테고리의 다른 글

프로그래머스. 표 편집 (doubly linked list)  (0) 2022.05.03
백준 15685. 드래곤 커브  (0) 2022.04.18
백준 17144. 미세먼지 안녕!  (0) 2022.04.15
백준 15683. 감시  (0) 2022.04.14
백준 14891. 톱니바퀴  (0) 2022.04.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함