[Programmers] 탑
Note : 이 글은 지극히 주관적인 생각을 토대로 작성된 글입니다. 혹시나 잘못된 부분이 있다면 메일 또는 코멘트를 통해 알려주시면 감사하겠습니다. 😄 제 메일은 About 탭에서 확인하실 수 있습니다. 📧
P.S : 이 페이지는 웹에 최적화 된 페이지입니다. 가급적 모바일이 아닌 웹에서 보시는 것을 추천드립니다.
문제 정보
-
문제 설명
-
수평 직선에 탑
N
대를 세웠습니다. 모든 탑의 꼭대기에는 신호를 송/수신하는 장치를 설치했습니다. -
발사한 신호는 신호를 보낸 탑보다 높은 탑에서만 수신합니다. 또한, 한 번 수신된 신호는 다른 탑으로 송신되지 않습니다.
-
예를 들어 높이가
6, 9, 5, 7, 4
인 다섯 탑이 왼쪽으로 동시에 레이저 신호를 발사합니다. 그러면, 탑은 다음과 같이 신호를 주고받습니다. -
높이가
4
인 다섯 번째 탑에서 발사한 신호는 높이가7
인 네 번째 탑이 수신하고, 높이가7
인 네 번째 탑의 신호는 높이가9
인 두 번째 탑이, 높이가5
인 세 번째 탑의 신호도 높이가9
인 두 번째 탑이 수신합니다. -
높이가
9
인 두 번째 탑과 높이가6
인 첫 번째 탑이 보낸 레이저 신호는 어떤 탑에서도 수신할 수 없습니다. -
탑의 송/수신 과정은 다음 표와 같습니다.
송신 탑(높이) 수신 탑(높이) 5(4) 4(7) 4(7) 2(9) 3(5) 2(9) 2(9) - 1(6) - -
맨 왼쪽부터 순서대로 탑의 높이를 담은 배열
heights
가 매개변수로 주어질 때 각 탑이 쏜 신호를 어느 탑에서 받았는지 기록한 배열을return
하도록solution
함수를 작성해주세요.
-
-
제한사항
-
heights
는 길이2
이상100
이하인 정수 배열입니다. -
모든 탑의 높이는
1
이상100
이하입니다. -
신호를 수신하는 탑이 없으면
0
으로 표시합니다.
-
-
입출력 케이스
heights return [6, 9, 5, 7, 4] [0, 0, 2, 2, 4] [3, 9, 9, 3, 5, 7, 2] [0, 0, 0, 3, 3, 3, 6] [1, 5, 3, 6, 7, 6, 5] [0, 0, 2, 0, 0, 5, 6] -
입출력 케이스 설명
-
케이스
#1
- 앞서 설명한 예와 같습니다.
-
케이스
#2
-
[1, 2, 3]
번째 탑이 쏜 신호는 아무도 수신하지 않습니다. -
[4, 5, 6]
번째 탑이 쏜 신호는3
번째 탑이 수신합니다. -
[7]
번째 탑이 쏜 신호는6
번째 탑이 수신합니다.
-
-
케이스
#3
-
[1, 2, 4, 5]
번째 탑이 쏜 신호는 아무도 수신하지 않습니다. -
[3]
번째 탑이 쏜 신호는2
번째 탑이 수신합니다. -
[6]
번째 탑이 쏜 신호는5
번째 탑이 수신합니다. -
[7]
번째 탑이 쏜 신호는6
번째 탑이 수신합니다.
-
-
소스코드
- 문제 풀이 언어 :
Java
import java.util.*;
import java.util.stream.IntStream;
class Solution {
public int[] solution(int[] heights) {
int[] answer = new int[heights.length];
Stack<Integer> stack = new Stack<>();
List<Integer> list = new ArrayList<>();
int answerIndex = heights.length - 1;
IntStream.rangeClosed(0, heights.length - 1).boxed()
.forEach(i -> stack.push(heights[i]));
IntStream.rangeClosed(0, heights.length - 1).boxed()
.forEach(i -> list.add(heights[i]));
while (!list.isEmpty()) {
int current = stack.peek();
boolean flag = false;
for (int j=list.size() - 1; j>=0; j--) {
if (current < list.get(j)) {
stack.pop();
list.remove(list.lastIndexOf(current));
answer[answerIndex] = j + 1;
flag = true;
answerIndex--;
break;
}
}
if (!flag) {
stack.pop();
list.remove(list.lastIndexOf(current));
answer[answerIndex] = 0;
answerIndex--;
}
}
return answer;
}
}