42584. ์ฃผ์ ๊ฐ๊ฒฉ
์ฝ๋ฉํ ์คํธ ์ฐ์ต - ์ฃผ์๊ฐ๊ฒฉ
๋ฌธ์ ์ ํ | ๋์ด๋ | ๊ฑธ๋ฆฐ ์๊ฐ | ํด๊ฒฐ ์ ๋ฌด(โ /โ) |
---|---|---|---|
์คํ/ํ | lv.2 | 1์๊ฐ | โ |
#
์ค๊ณ ๋ฐฉ๋ฒpirces
์ ๊ฐ์ ๊ธธ์ด์ ๋ฐฐ์ด์ ๋ง๋ ๋ค.์ด ๋จ์ ์์ ์ ๋ด์ ์คํ์ ๋ง๋ ๋ค.
s.top()
์ ๋ฐ๋ก ์ ์์ ์ด๋ค.
prices
๋ฅผ ์ํํ๋ฉฐ ํ์ฌ ๊ฐ๊ฒฉ๋ณด๋ค ์ด์ ๊ฐ๊ฒฉ๋ณด๋ค ๋จ์ด์ก๋ค๋ฉด,์ด์ ์์ ์
answer
๋ ํ์ฌ ์๊ฐ (i
) - ๋ฐ๋ก ์ ์์ (s.top()
)์ด๋ค.์คํ์ ๋ฐ๋ณตํ๋ฉฐ ๊ทธ ์ ์์ ์ ๋ํด์๋ ๋ฐ๋ณตํ๋ค.
ํ์ฌ ์์ (
i
)๋ฅผ ์คํ์ ๋ฃ๋๋ค.์คํ์ ๊ฐ์ด ๋จ์๋ค๋ฉด ๊ทธ ์์ ์ ๋ต์ ์ ์ฒด ๊ธธ์ด - ์์ - 1 ์ด๋ค.
#
์ฝ๋def solution(prices): answer = [0] * len(prices) stack = []
for i in range(len(prices)): while stack and prices[stack[len(stack) - 1]] > prices[i]: answer[stack[len(stack) - 1]] = i - stack[len(stack) - 1] stack.pop() stack.append(i)
while stack: answer[stack[len(stack) - 1]] = len(prices) - stack[len(stack) - 1] - 1 stack.pop()
return answer
function solution(prices) { const answer = Array(prices.length); const s = new Stack();
prices.forEach((price, i) => { while (!s.isEmpty() && prices[s.top()] > price) { answer[s.top()] = i - s.top(); s.pop(); } s.push(i); });
while (!s.isEmpty()) { answer[s.top()] = prices.length - s.top() - 1; s.pop(); }
return answer;}
class Stack { constructor() { this._arr = []; }
push(value) { this._arr.push(value); }
pop() { return this._arr.pop(); }
top() { return this._arr[this._arr.length - 1]; }
isEmpty() { return this._arr.length === 0; }}
module.exports = solution;
#
์๊ฐ ๋ณต์ก๋prices
์ํ : O(NM)์คํ ์ํ : O(M)
์ ๋ชจ๋ฅด๊ฒ ๋ค.
#
์ด๋ ค์ ๋ ์ ์ด์ค ๋ฐ๋ณต๋ฌธ์ ์ฐ๋ ๋ฐฉ๋ฒ์ด ๋จผ์ ๋ ์ฌ๋์ง๋ง ์ญ์ ์๊ฐ ์ด๊ณผ ์๋ฌ๊ฐ ๋์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด์ผ ํ๋ค.
JS์์ ๋ฐฐ์ด์ ์คํ์ผ๋ก ์ธ ๋
top()
,isEmpty()
๋ฉ์๋๊ฐ ์์ด์ ์ง์ ๊ตฌํํ๋๊ฒ ๋ถํธํ๋ค.shift
์ฐ์ฐ์ด O(n)์ด๋ผ ์ ๊ฒฝ์ฐ์ฌ์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ตฌํํด ๋ดค๋ค.
class Stack { constructor(...items) { this._items = [];
if (items.length > 0) { items.forEach((item) => this._items.push(item)); } }
push(...items) { items.forEach((item) => this._items.push(item)); return this._items; }
pop(count = 0) { if (count === 0) { return this._items.pop(); } else { return this._items.splice(-count, count); } }
peek() { return this._items[this.end - 1]; }
size() { return this._items.length; }
isEmpty() { return this._items.length === 0; }
toArray() { return this._items; }}
class Queue { constructor(...items) { this._items = []; this.start = 0; this.end = this._items.length;
this.enqueue(...items); }
enqueue(...items) { items.forEach((item) => this._items.push(item)); this.end += items.length; }
dequeue(count = 1) { const prev = this.start; this.start += count; const items = this._items.slice(prev, this.start);
if (this.start * 2 >= this._items.length) { this._items = this._items.slice(this.start); this.start = 0; this.end = this._items.length; }
return items; }
isEmpty() { return this.end === this.start; }
peek() { return this._items[this.end - 1]; }
size() { return this.end - this.start; }
toArray() { return this._items.slice(this.start, this.end); }}