<Algorithm> 203. 탑(BJO)
by BFine반응형
1. 2493번 탑
사용 알고리즘 : 스택
-
처음에 배열로 풀어보고 이후에 스택문제라 스택으로도 풀어보았다. 똑같은 로직으로 해서 속도차이는 크게 없었다.
주의 할점은 5 1 1 3 1 2 형태나 3 3 1 3 형태에서 크기가 같은 빌딩에 대한 예외처리가 필요했다. 이 부분때문에 조금 오래 걸렸다.
문제에 대한 접근&생각
- 탑은 각각 크기를 가지고 있음-> 오른쪽에서 왼쪽으로 레이저를 발사함 -> 레이저는 하나의 빌딩에만 수신-> 일직선(작으면 통과)
- 왼쪽부터 탐색 -> 빌딩 크기 비교(왼쪽이 크거나 같을경우 바로 왼쪽에 도달) -> 작을경우 클때까지 탐색 -> 스택!
코드
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 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Stack; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); /****************************** * 스택을 이용하여 이전 빌딩이 더 클 경우 * 같을 경우 인덱스를 저장한다. 작을 경우는 * 스택안의 빌딩들을 차례로 비교하면서 * 수신되는 빌딩의 인덱스를 찾는다. *******************************/ int[] bu = new int[n]; int[] rcv = new int[n]; StringTokenizer st = new StringTokenizer(br.readLine()); for(int i = 0; i < n; i++) { bu[i] = Integer.parseInt(st.nextToken()); } Stack<Integer> stack = new Stack<>(); rcv[0] = -1; for(int i = 1; i < n; i++) { if(bu[i-1]>=bu[i]) { rcv[i] = i-1; stack.push(i-1); }else { while(!stack.isEmpty()&&(bu[stack.peek()] <= bu[i])) { stack.pop(); } if(stack.empty()) { rcv[i] = -1; }else { rcv[i] = stack.peek(); } stack.add(i); } } Arrays.stream(rcv).forEach(ele->{ System.out.print((ele<0?0:ele+1)+" "); }); } } public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); int[] bu = new int[n]; int[] rcv = new int[n]; StringTokenizer st = new StringTokenizer(br.readLine()); for(int i = 0; i < n; i++) { bu[i] = Integer.parseInt(st.nextToken()); } int high = 0; rcv[0] = -1; for(int i = 1; i < n; i ++) { if(bu[i-1] >= bu[i]) { rcv[i] = i-1; high = i-1; }else { rcv[i] = high; if(bu[high] < bu[i]) { while(true) { high = rcv[high]; if(high == -1||bu[high]>=bu[i]) break; } rcv[i] = high; high = i; } } } Arrays.stream(rcv).forEach(ele->{ System.out.print((ele<0?0:ele+1)+" "); }); } } | cs |
반응형
'공부(2018~2019) - 스킨변경전 > Algorithm' 카테고리의 다른 글
<Algorithm> 205. 캠핑(Programmers) (0) | 2019.05.25 |
---|---|
<Algorithm> 204. 2차원 배열의 합(BJO) (0) | 2019.05.22 |
<Algorithm> 202. 하노이 탑 이동순서(BJO) (0) | 2019.05.20 |
<Algorithm> 201. 게임맵최단거리(Programmers) (0) | 2019.05.18 |
<Algorithm> 200. 설탕배달(BJO) (0) | 2019.05.07 |
블로그의 정보
57개월 BackEnd
BFine