/ PROBLEMS

[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;
    }
}