๐Ÿ”ข Algorithm

[Javascript][Programmers] ์นด๋“œ ๋ญ‰์น˜

์œค๋„๊ธฐ 2024. 8. 16. 11:39
๋ฐ˜์‘ํ˜•

 

๋ฌธ์ œ

๋ฌธ์ œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์ด ์ œ์‹œ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์นด๋“œ ๋ญ‰์น˜์—์„œ ์นด๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ์นด๋“œ๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ์กด์— ์ฃผ์–ด์ง„ ์นด๋“œ ๋ญ‰์น˜์˜ ๋‹จ์–ด ์ˆœ์„œ๋Š” ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์กฐ๊ฑด๋“ค์„ ๊ณ ๋ คํ•ด๋ณด๋ฉด, ์ด ๋ฌธ์ œ๋Š” "์„ ์ž…์„ ์ถœ(FIFO: First In, First Out)" ์›์น™์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํŠน์„ฑ์„ ๊ฐ€์žฅ ์ž˜ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ํ(Queue)์ž…๋‹ˆ๋‹ค. 

 

๋‚˜์˜ ํ’€์ด

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(M) (cards์˜ ๊ธธ์ด: N, goal์˜ ๊ธธ์ด: M)
function solution(cards1, cards2, goal) {
    let index1 = 0;
    let index2 = 0;

    for (let goalIndex = 0; goalIndex < goal.length; goalIndex++) {
        if (index1 < cards1.length && goal[goalIndex] === cards1[index1]) {
            index1++;
        } else if (index2 < cards2.length && goal[goalIndex] === cards2[index2]) {
            index2++;
        } else {
            return "No";
        }
    }

    return "Yes";
}

 

๋‹ค๋ฅธ ํ’€์ด

์ง์ ‘ ํ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋ณต์žก๋„: O(M)
class Queue {
  items = [];
  front = 0;
  rear = 0;

  // ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•ด ํŽธํ•˜๊ฒŒ ์ดˆ๊ธฐํ™”
  constructor(array) {
    this.items = array;
    this.rear = array.length;
  }

  push(item) {
    this.items.push(item);
    this.rear++;
  }

  pop() {
    return this.items[this.front++];
  }

  first() {
    return this.items[this.front];
  }

  isEmpty() {
    return this.front === this.rear;
  }
}


function solution(cards1, cards2, goal) {
  // cards์™€ goal์„ Queue๋กœ ๋ณ€ํ™˜
  cards1 = new Queue(cards1);
  cards2 = new Queue(cards2);
  goal = new Queue(goal);

  // โžŠ goal์˜ ๋ฌธ์ž์—ด์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆœํšŒ
  while (!goal.isEmpty()) {
    if (!cards1.isEmpty() && cards1.first() === goal.first()) { // โž‹ card1์˜ front์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ
      cards1.pop();
      goal.pop();
    } else if (!cards2.isEmpty() && cards2.first() === goal.first()) { // โžŒ card2์˜ front์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ
      cards2.pop();
      goal.pop();
    } else {
      break;
    }
  }

  return goal.isEmpty() ? "Yes" : "No"; // โž goal์ด ๋น„์—ˆ์œผ๋ฉด “Yes” ์•„๋‹ˆ๋ฉด “No”๋ฅผ ๋ฐ˜ํ™˜
}

Reference

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ํ•ฉ๊ฒฉ์ž๋˜๊ธฐ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŽธ

๋ฐ˜์‘ํ˜•