์ค๋์ ์๋ฃ ๊ตฌ์กฐ ์ค ์คํ๊ณผ ํ ๊ด๋ จํด์ ๊ณต๋ถํ๊ณ ๋ฌธ์ ๋ฅผ ์กฐ๊ธ ํ์ด๋ดค๋ค!
์คํ์ ํ์ ์ ์ถ(Last In First Out) ๊ตฌ์กฐ์ด๋ค. (ํ๋ง๊ธ์ค ๊ฐ์..?)
์ฆ, ์๋ฃ๊ตฌ์กฐ Stack์ ํน์ง์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ด ํ๋์ ๋ฐฉํฅ, ์ฆ ์คํ์ ์ต์๋จ์์๋ง ์ด๋ฃจ์ด์ง๋ฉฐ, ์ด๋ฅผ ์ ํ์ ์ ๊ทผ์ด๋ผ๊ณ ํ๋ค.
LIFO(Last In First Out) ํน์ FILO(First In Last Out)
Stack์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๊ฒ์ 'PUSH', ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋ ๊ฒ์ 'POP'
์ค์ํ์์๋ ๋ธ๋ผ์ฐ์ ์ ๋ค๋ก ๊ฐ๊ธฐ, ์์ผ๋ก ๊ฐ๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋ ํ์ฉ๋๋ค.
์๊ฐ ๋ณต์ก๋
O(1)
O(n)
์คํ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค
์ฝ์ ๊ณผ ์ญ์ ๊ฐ ํญ์ ์คํ์ ๋งจ ์์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์คํ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ๊ฑฐ๋ ์ญ์ ํ ๋, ๋ค๋ฅธ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค!
๋น์ฐํ๊ฒ๋, ์ค๊ฐ ์์์ ์ ๊ทผ์ด ์ ํ๋๋ค
์๋จ(top) ์์์๋ง ์ง์ ์ ์ธ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ค๊ฐ์ ์๋ ์์์๋ ์ง์ ์ ์ธ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๋ํ, ์คํ์ ํฌ๊ธฐ๋ฅผ ๊ณ ์ ํด์ ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ฏ๋ก ๋ฐ์ดํฐ ์ต๋ ๊ฐ์๋ฅผ ๋ฏธ๋ฆฌ ์ ํด์ผ ํ๋ค๋ ๋จ์ ๋ ์๋ค.
ํ(Queue)๋ ์ค์ ์์ ๊ธฐ๋ค๋ฆฌ๋ค, ๋๊ธฐ์ด์ด๋ผ๋ ๋ป
์๋ฃ๊ตฌ์กฐ Queue๋ Stack๊ณผ ๋ฐ๋๋๋ ๊ฐ๋ ์ผ๋ก, ๋จผ์ ๋ค์ด๊ฐ ๋ฐ์ดํฐ(data)๊ฐ ๋จผ์ ๋์ค๋ FIFO(First In First Out) ํน์ LILO(Last In Last Out)์ ํน์ง์ผ๋ก ๊ฐ์ง๊ณ ์๋ค.
์ ๋ ฅ์ ๋ฐฉํฅ๊ณผ ์ถ๋ ฅ์ ๋ฐฉํฅ์ด ๊ฐ๊ฐ ๊ณ ์ ๋์ด ์์ผ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ ์์๋ ํ์ ๋์์(rear), ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ ๋๋ ํ์ ๋งจ ์์์(front) ์งํ.
Queue์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๊ฒ์ 'enqueue', ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด๋ ๊ฒ์ 'dequeue'๋ผ๊ณ ๋ ํ๋ฉฐ, ์๋ฃ๊ตฌ์กฐ Queue๋ ๋ฐ์ดํฐ(data)๊ฐ ์ ๋ ฅ๋ ์์๋๋ก ์ฒ๋ฆฌํ ๋ ์ฃผ๋ก ์ฌ์ฉ
๊ฐ ์ฒ๋ฆฌ ์๋ง๋ค ํ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ฑฐ๋ ๋บ ์ ์๋ค. ์ฆ, ํ์ ํ ๊ฐ์ฉ ์ฌ๋ฌ ๋ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ํ ๋ด๋ถ์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๊ฐ ์์ฌ ์๋ค๊ณ ํ๋๋ผ๋, ๋ฐ์ดํฐ๋ฅผ ๋บ ๋๋ ํ์ ๋งจ ์์์ ํ ๋ฒ์ ํ ๊ฐ์ ๋ฐ์ดํฐ๋ง์ ๋บ ์ ์๋ค,
์ ํ ํ, ์ฐ์ ์์ ํ, ์ํ ํ ์ธ์ข ๋ฅ๊ฐ ์กด์ฌ.
BFS(Breadth First Search) ์๊ณ ๋ฆฌ์ฆ์์ ์ฃผ๋ก ์ฌ์ฉ
์๊ฐ ๋ณต์ก๋๋ ์คํ๊ณผ ๋์ผํ๋ค!
ํ๋ ์์ผ๋ฌธ์ ์ง๊ฟ์ด๋ค!
1. ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ ์์ ์ฒ๋ฆฌ์์ ์์๊ฐ ์ค์ํ ๊ฒฝ์ฐ์ ์ ์ฉ
์ ์ ์ ์ถ(First-In-First-Out, FIFO)์ ํน์ง ๋๋ถ์ ์ฒ๋ฆฌํด์ผ ํ ๋ฐ์ดํฐ๋ ์์ ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
ํ์ ๊ฐ์ฅ ์(front)์์๋ ๊ฐ์ฅ ์ค๋์ ์ ์ฝ์
๋ ๋ฐ์ดํฐ๊ฐ, ๊ฐ์ฅ ๋ค(rear)์๋ ๊ฐ์ฅ ์ต๊ทผ์ ์ฝ์
๋ ๋ฐ์ดํฐ๊ฐ ์์นํ๋ค.
์ฆ, ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ๋ ์์์ ์ญ์ ํ๋ ์์๊ฐ ์ผ์นํ๊ฒ ์ ์ง!
ex. ํ๋ฆฐํฐ์์ ์ธ์ ์์ฒญ์ด ๋ค์ด์จ ์์๋๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ํ์์ ๋๊ธฐ ์ค์ธ ๊ณ ๊ฐ ์์๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒฝ์ฐ, ์ฑํ ์์คํ ์์ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์์๋ฅผ ๊ฒฐ์ ํ๋ ๊ฒฝ์ฐ
2. ๋ค๋ฅธ ์๋ฃ ๊ตฌ์กฐ์ ๋นํด ์๋์ ์ผ๋ก ์๋๊ฐ ๋น ๋ฅด๋ค
ํ์ ์ฝ์ ๊ณผ ์ญ์ ๋ ๊ฐ๊ฐ ํ์ ๋๋จ์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์, ์ค๊ฐ์ ์์นํ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ์ ์๋ค.
ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์
ํ ๋์๋ ํ์ ๋๋จ์์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ๋๋๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ ๋๋ ํ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋ ๊ฒ์ผ๋ก ๋๋๋ค.
์ฆ ํ์ ์์๋ฅผ ์ฝ์
ํ๊ฑฐ๋ ์ญ์ ํ ์ ๋จ ํ ๋ฒ์ ์คํ๋ง์ผ๋ก ์ฒ๋ฆฌ๊ฐ๋ฅํ๋ค. (์๊ฐ๋ณต์ก๋: O(1))
ํ๋ ํน์ ์์น์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์์ ํ๋ ์ํฉ์๋ ์ ํฉํ์ง ์๋ค.
ํ๋ ๋ค๋ฅธ ์์น์ ๋ฐ์ดํฐ์ ์ง์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์ฐ์ฐ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ, ์ค๊ฐ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ฒ๋ ๋ถ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ์ ํฉํ ์๋ฃ ๊ตฌ์กฐ์ด๋ค.
์คํ๊ณผ ํ ๋ชจ๋ ์ ํ ์๋ฃ๊ตฌ์กฐ๋ก, ์์ฐจ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์กฐ์ํ๋ค. ๋ ๋ค ๋ฐ์ดํฐ์ ์ถ๊ฐ์ ์ ๊ฑฐ๋ฅผ ํตํด ๋์ํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์คํ๊ณผ ํ์ ์ฃผ์ ์ฐจ์ด์ ์ ๋ฐ์ดํฐ์ ์ถ๊ฐ์ ์ ๊ฑฐ ๋ฐฉ์์์ ๋ํ๋๋ค. ์คํ์์๋ ๋ฐ์ดํฐ์ ์ถ๊ฐ์ ์ ๊ฑฐ๊ฐ ๊ฐ์ ๊ณณ์์ ์ด๋ฃจ์ด์ง๋ ๋ฐ๋ฉด, ํ์์๋ ๋ฐ์ดํฐ์ ์ถ๊ฐ๊ฐ ํ ์ชฝ ๋์์, ์ ๊ฑฐ๊ฐ ๋ฐ๋ ์ชฝ ๋์์ ์ด๋ฃจ์ด์ง๋ค.
๊ดํธ๊ฐ ๋ฐ๋ฅด๊ฒ ์ง์ง์ด์ก๋ค๋ ๊ฒ์ '(' ๋ฌธ์๋ก ์ด๋ ธ์ผ๋ฉด ๋ฐ๋์ ์ง์ง์ด์ ')' ๋ฌธ์๋ก ๋ซํ์ผ ํ๋ค๋ ๋ป์ ๋๋ค. ์๋ฅผ ๋ค์ด
"()()" ๋๋ "(())()" ๋ ์ฌ๋ฐ๋ฅธ ๊ดํธ์
๋๋ค.
")()(" ๋๋ "(()(" ๋ ์ฌ๋ฐ๋ฅด์ง ์์ ๊ดํธ์
๋๋ค.
'(' ๋๋ ')' ๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด s๊ฐ ์ฃผ์ด์ก์ ๋, ๋ฌธ์์ด s๊ฐ ์ฌ๋ฐ๋ฅธ ๊ดํธ์ด๋ฉด true๋ฅผ return ํ๊ณ , ์ฌ๋ฐ๋ฅด์ง ์์ ๊ดํธ์ด๋ฉด false๋ฅผ return ํ๋ solution ํจ์๋ฅผ ์์ฑํด ์ฃผ์ธ์.
์ ํ์ฌํญ
function solution(s){
const stack = [];
if(s[0] === ')' || s[s.length-1] === '('){
return false
}
s.split('').map((target) => {
if(target === ')'){
stack.pop()
}
else{
stack.push(target)
}
})
return stack.length === 0;
}
function solution(progresses, speeds) {
let stack = [];
let answer = [];
for(let i = 0; i < progresses.length; i++){
stack.push(Math.ceil((100 - progresses[i]) / speeds[i]))
}
let currentNum = stack[0]
let complete = 0;
for(let i = 0; i < stack.length; i++){
if(stack[i] <= currentNum){
complete++;
}else{
answer.push(complete);
complete = 1;
currentNum = stack[i]
}
}
answer.push(complete)
return answer;
}
arr.length
๋ก true, false ํํ๊ฐ๋ฅ