๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/์ž๋ฃŒ๊ตฌ์กฐ ์ด๋ก 

์„ ํ˜•์ž๋ฃŒ๊ตฌ์กฐ - ๋ฐํฌ

by so_119 2023. 8. 5.

๋ฐํฌ๋Š” ์„ ํ˜•์ž๋ฃŒ๊ตฌ์กฐ ์ค‘์—์„œ๋„ ์–‘๋ฐฉํ–ฅ์—์„œ ์‚ฝ์ž… ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. (stack + Queue)

์ด๋Ÿฌํ•œ ๋ฐํฌ๋Š” ์‚ฌ์šฉ์‹œ ์ผ๋ถ€๊ธฐ๋Šฅ์„ ์ œํ•œํ•˜์—ฌ ์šฉ๋„์— ๋งž๊ฒŒ ๋ณ€ํ˜• ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

๋˜ํ•œ ๋ฐํฌ๋Š” ์‚ฝ์ž… ์ถœ๋ ฅ๋ฐ ์‚ญ์ œ๋ฅผ ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ฐ๊ฐ ๋‘ ๊ฐœ์”ฉ ์žˆ๋‹ค. 

1. add ์™€ remove : ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ์‹œ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. (์™œ๋ƒํ•˜๋ฉด null๋“ฑ์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋ฐœ์ƒ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

2. offer ์™€ poll : null ์ด๋‚˜ false๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค. 

 

๋ฐํฌ์˜ ์ข…๋ฅ˜ 2๊ฐ€์ง€ 

1. ์ž…๋ ฅ์ œํ•œ ๋ฐํฌ (Scroll) : ํ•œ์ชฝ์˜ ์ž…๋ ฅ์„ ์ œํ•œํ•œ ๋ฐํฌ

2. ์ถœ๋ ฅ์ œํ•œ ๋ฐํฌ (Shelf) : rear ๋‚˜ front ์ชฝ ์ค‘ ํ•˜๋‚˜์˜ ์ถœ๋ ฅ์„ ์ œํ•œํ•œ ๋ฐํฌ

 

java์—์„œ์˜ ๋ฐํฌ ์‚ฌ์šฉ

Deque deque = new ArrayDeque();

 

deque.addFirst(); // front ๋กœ add

deque.addLast(); // rear๋กœ add

deque.removeFirst(); // Front๋กœ remove

deque.removeLase(); // rear๋กœ remove

// add ์™€ remove๋Š” ๊ฝ‰์ฐจ์žˆ๊ฑฐ๋‚˜ ๋น„์–ด์žˆ์–ด ์‚ฝ์ž… ์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ null์ด๋‚˜ false๊ฐ€ ์•„๋‹Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๋ฐœ์ƒํ•œ๋‹ค. 

 

deque.offerFirst(); // front๋กœ ๊ฐ’ ์ถ”๊ฐ€ -> full์‹œ์— false ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ 

deque.pollLase(); // rear๋กœ ๊ฐ’ ์‚ญ์ œ -> empty์‹œ์— Null ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ

 

java์—์„œ importํ•˜์ง€ ์•Š๊ณ  ๋ฐํฌ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

1. ArrayList๋ฅผ ์ด์šฉํ•œ ๋ฐํฌ ๊ตฌํ˜„

 ์ƒ์„ฑ์ž์—์„œ ArrayList ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ 

 ๋‹จ์ˆœํžˆ isEmpty, addFirst, addLast, removeFirst, removeLast, printDeque ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„ํ•˜๊ธฐ

 * addFirst ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„์‹œ index 0์— ์‚ฝ์ž…

 * getํ• ๋•Œ (size - 1) ๋ฒˆ index๊บผ ๊บผ๋‚ด์˜ค๊ธฐ 

 

2. ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฐํฌ ๊ตฌํ˜„

  isEmpty : rear == front ์ผ๋•Œ

  isFull : (rear + 1) % length == front ์ผ๋•Œ

  addFirst : isFull์ด ์•„๋‹๋•Œ data ๋„ฃ๊ณ ,  front = (front -1 + arr.length) % arr.length;

  addLast : isFull์ด ์•„๋‹๋•Œ, data๋„ฃ๊ณ ,  rear = (rear + 1 ) % arr.length;

  removeFirst : isEmpty๊ฐ€ ์•„๋‹๋•Œ, front = (front + 1) % arr.length;  return arr[front];

  removeLast : isEmpty๊ฐ€ ์•„๋‹๋•Œ, data = arr[rear]; ํ›„ !!!  rear = (rear - 1 + arr.length) % arr.length; return data;

 

๋ฐํฌ๋ฅผ ์ด์šฉํ•œ ์—ฐ์Šต๋ฌธ์ œ

๋ฌธ์ œ01) 0 -> 1-> ... -> n-1 -> n์˜ ํ˜•ํƒœ๋ฅผ 0 -> n -> 1 -> n-1 -> ... ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

code)

Deque deque = new ArrayDeque();

ArrayList result = new ArrayList();

 

IntStream.of(arr).forEach(x -> deque.addLast(x));

 

while(!deque.isEmpty()){

   result.add(deque.removeFirst();

   if(!deque.isEmpty()){

     result.add(deque.removeLat(); 

  }

}

 

๋ฌธ์ œ01) ํŽ ๋ฆฐ๋“œ๋กฌ (palindrome) ์ฐพ๊ธฐ (์•ž์œผ๋กœ ์ฝ๋‚˜ ๋’ค๋กœ ์ฝ๋‚˜ ๋˜‘๊ฐ™์ด ์ฝํžˆ๋Š” ๋ฌธ์ž๋ฅผ ๋งํ•œ๋‹ค.)

code)

Deque duque = new ArrayDeque();

boolean isFront = true;

boolean isPalindrome = true;

 

for(String s : str.split(" ")){

  deque.addFirst(s);

}

while( !deque.isEmpty()){

  String s1 = deque.pollFirst();

  String s2 = deque.pollLast();

  // remove ๋Œ€์‹  poll์„ ์ด์šฉํ•˜๋ฉด null ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅํ•ด์ง

  //๊ธ€์ž์ˆ˜๊ฐ€ ํ™€์ˆ˜๊ฐœ์ธ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด s2๊ฐ€ null์ด์—ฌ๋„ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋ฐœ์ƒ๋˜์ง€ ์•Š๊ฒŒ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค!

  if( s1 != null && s2 != null && !s1.equals(s2)){

      isPalindrome = false;

      break;

   }

}

 

return isPalindrome;

 

 

๋ฌธ์ œ03) ๋ฐฐ์—ด๋กœ ๋ฐํฌ๊ตฌํ˜„ & middle data ๋„ฃ๊ธฐ

 

๋ฌธ์ œ04) ๋ฐฐ์—ด๊ณต๊ฐ„์ด ๊ฐ€๋“์ฐผ์„๋•Œ 2๋ฐฐ๋กœ ๋Š˜๋ฆฐ ๊ณต๊ฐ„์œผ๋กœ ๋ฐํฌ ์˜ฎ๊ธฐ๊ธฐ