728x90

문제 설명

수평 직선에 탑 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으로 표시합니다.

입출력 예

heightsreturn

[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번째 탑이 수신합니다.


스택을 이용해서 풀었다.

스택을 쓸 땐 항상 스택이 비어있는지를 확인하는 게 중요하다.

스택이 비어있는데 st.top()을 실행하면 오류가 뜨기 때문이다.

 

아무튼 탑의 첫번째부터 마지막까지 차례대로 조사하면서

스택이 비어있다면 answer에 0을 넣고 탑의 높이와 인덱스를 넣어주자.

스택의 top이 현재 탑의 높이보다 높다면 answer에 해당 탑의 높이를 기록하고, 이 탑도 스택에 넣어주자.

스택의 top이 현재 탑의 높이보다 낮다면 더 높은 탑이 나오거나 스택이 빌 때 까지 스택을 pop해주자.

그 후엔 앞에서 한 것과 똑같은 과정을 반복하면 된다.

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/Programmers/%ED%83%91.cpp

 

chosh95/STUDY

프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

 

C++ 코드

#include <iostream>
#include <stack>
#include <vector>
using namespace std;

// heights_lenÀº ¹è¿­ heightsÀÇ ±æÀÌÀÔ´Ï´Ù.
vector<int> solution(vector<int> p) {
	vector<int> answer(p.size());
	stack<pair<int, int>> st;
	for (int i = 0; i < p.size(); i++) {
		if (st.empty()) {
			answer[i] = 0;
			st.push({ p[i],i+1 });
		}
		else if (st.top().first > p[i]) {
			answer[i] = st.top().second;
			st.push({ p[i],i+1 });
		}
		else if (st.top().first <= p[i]) {
			while (!st.empty() && st.top().first <= p[i]) {
				st.pop();
			}			
			if (st.empty()) {
				answer[i] = 0;
				st.push({ p[i],i+1 });
			}
			else if (st.top().first > p[i]) {
				answer[i] = st.top().second;
				st.push({ p[i],i+1 });
			}
		}
	}
	return answer;
}

int main()
{
	vector<int> v = { 1,5,3,6,7,6,5 };
	vector<int> res = solution(v);

	for (int i = 0; i < res.size(); i++)
		cout << res[i] << " ";
}
728x90

+ Recent posts