๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm] ๋ฌผํ†ต (๋ฐฑ์ค€ - 2251)

๐Ÿ“‹ ๋ฌธ์ œ

๊ฐ๊ฐ ๋ถ€ํ”ผ๊ฐ€ A, B, C(1≤A, B, C≤200) ๋ฆฌํ„ฐ์ธ ์„ธ ๊ฐœ์˜ ๋ฌผํ†ต์ด ์žˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์•ž์˜ ๋‘ ๋ฌผํ†ต์€ ๋น„์–ด ์žˆ๊ณ , ์„ธ ๋ฒˆ์งธ ๋ฌผํ†ต์€ ๊ฐ€๋“(C ๋ฆฌํ„ฐ) ์ฐจ ์žˆ๋‹ค. ์ด์ œ ์–ด๋–ค ๋ฌผํ†ต์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ์„ ๋‹ค๋ฅธ ๋ฌผํ†ต์œผ๋กœ ์Ÿ์•„ ๋ถ€์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ์—๋Š” ํ•œ ๋ฌผํ†ต์ด ๋น„๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ํ•œ ๋ฌผํ†ต์ด ๊ฐ€๋“ ์ฐฐ ๋•Œ๊นŒ์ง€ ๋ฌผ์„ ๋ถ€์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์†์‹ค๋˜๋Š” ๋ฌผ์€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์น˜๋‹ค๋ณด๋ฉด ์„ธ ๋ฒˆ์งธ ๋ฌผํ†ต(์šฉ๋Ÿ‰์ด C์ธ)์— ๋‹ด๊ฒจ์žˆ๋Š” ๋ฌผ์˜ ์–‘์ด ๋ณ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋ฌผํ†ต(์šฉ๋Ÿ‰์ด A์ธ)์ด ๋น„์–ด ์žˆ์„ ๋•Œ, ์„ธ ๋ฒˆ์งธ ๋ฌผํ†ต(์šฉ๋Ÿ‰์ด C์ธ)์— ๋‹ด๊ฒจ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ์˜ ์–‘์„ ๋ชจ๋‘ ๊ตฌํ•ด๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์„ธ ์ •์ˆ˜ A, B, C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋‹ต์„ ์ถœ๋ ฅํ•œ๋‹ค. ๊ฐ ์šฉ๋Ÿ‰์€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

์˜ˆ์ œ ์ž…๋ ฅ ์˜ˆ์ œ ์ถœ๋ ฅ
8 9 10 1 2 8 9 10


โœ๏ธ ํ’€์ด

์ด ๋ฌธ์ œ๋Š” DFS๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์—ˆ๋‹ค. ์ƒ๊ฐํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ค์› ๋Š”๋ฐ ๋ฌผ์ด ์ฐจ์žˆ๋Š” ๊ฐ ์ƒํ™ฉ์„ ํ•˜๋‚˜์˜ ๊ฒฝ์šฐ๋กœ ๋ณด๊ณ  ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ƒ๊ฐํ–ˆ๋‹ค.

 

๋‹ต์„ ์ €์žฅํ•˜๋Š” answer๋Š” ์ค‘๋ณต์ด ๋˜๋Š” ๋‹ต์ด ์žˆ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— Set์„ ์ด์šฉํ–ˆ๋‹ค. ๋˜ํ•œ check๋„ Set์„ ์ด์šฉํ•ด์„œ ์ด์ „์— ํƒ์ƒ‰ํ–ˆ๋˜ ๋ฌผ์ด ์ฐจ์žˆ๋Š” ์ƒํ™ฉ์„ ์ €์žฅํ•˜๋ฉฐ ์ค‘๋ณต์„ ํšŒํ”ผํ–ˆ๋‹ค.

 

์„ธ ๋ฒˆ์งธ ๋ฌผํ†ต์— ๋ฌผ์ด ๊ฐ€๋“ ์ฐจ์žˆ๋Š” ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์ƒํ™ฉ๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ƒํ™ฉ๋„ ์ฒซ ๋ฒˆ์งธ ๋ฌผํ†ต์ด ๋น„์–ด์žˆ๋Š” ์ƒํ™ฉ์ด๊ธฐ ๋•Œ๋ฌธ์— ํƒ์ƒ‰ํ•˜๊ธฐ ์ „์— answer์™€ check์— ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค. while๋ฌธ ๋‚ด๋ถ€์—๋Š” for๋ฌธ์ด ์ด์ค‘์œผ๋กœ ์กด์žฌํ•˜๋Š”๋ฐ ์™ธ๋ถ€์˜ for๋ฌธ์€ ์„ ํƒํ•œ ๋ฌผํ†ต์—์„œ ๋‹ค๋ฅธ ๋ฌผํ†ต์œผ๋กœ ๋ถ“๊ธฐ ์œ„ํ•ด ๋ฌผ์ด ์žˆ๋Š” ๋ฌผํ†ต์„ ์„ ํƒํ•˜๋Š” for๋ฌธ์ด๊ณ , ๋‚ด๋ถ€์˜ for๋ฌธ์€ ๋ฌผ์„ ๋ถ€์„ ํ†ต์„ ๊ณ ๋ฅด๊ธฐ ์œ„ํ•จ์ด๋‹ค. 

 

ํ†ต์— ๋ฌผ์ด ๊ฐ€๋“ ์ฐจ์žˆ๊ฑฐ๋‚˜, ์„ ํƒํ•œ ๋ฌผํ†ต์ด ๊ฐ™์œผ๋ฉด continue ์‹œ์ผœ์ฃผ๊ณ  ๊ณ„์‚ฐํ–ˆ๋‹ค. ์ดํ›„ ๊ณ„์‚ฐํ•œ ๊ฐ’์€ check์— ์ €์žฅ๋˜๊ณ  ์ฒซ ๋ฒˆ์งธ ๋ฌผํ†ต์— ๋ฌผ์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  answer์— ๋„ฃ์–ด์คฌ๋‹ค. ์ด๋•Œ ๋ฌผ์ด ์ฐจ์žˆ๋Š” ์ƒํ™ฉ์„ ์ „๊ฐœ๊ตฌ๋ฌธ(...)์„ ์ด์šฉํ•ด์„œ ๋ณต์‚ฌํ–ˆ๋Š”๋ฐ for๋ฌธ์—์„œ ๊ณ„์† ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ์— ์˜ํ•œ ์›๋ณธ ๋ฐฐ์—ด์˜ ์ˆ˜์ •์„ ๊ณ ๋ คํ•˜๋Š” ์ด์œ ์˜€๋‹ค.

 

queue์— ๋” ์ด์ƒ ๋“ค์–ด์žˆ๋Š” ๋ฌผํ†ต์˜ ์ƒํ™ฉ์ด ์—†์„ ๋•Œ while ๋ฌธ์ด ์ข…๋ฃŒ๋˜๊ณ  ์ •๋ ฌํ•˜๊ณ  join์„ ์ด์šฉํ•ด์„œ console.log๋ฅผ ํ•œ๋ฒˆ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

โŒจ๏ธ ์ฝ”๋“œ

const fs = require("fs");
const filePath =
  process.platform === "linux" ? "/dev/stdin" : "./testcase/2251.txt";

const inputs = fs.readFileSync(filePath).toString().trim().split("\n");

const bottle = inputs[0].split(" ").map(Number);
const queue = [[0, 0, bottle[2]]];

const answer = new Set();
answer.add(bottle[2]);
const checkHash = new Set();
checkHash.add(queue[0].join("-"));

while (queue.length) {
  const target = queue.pop();

  for (let i = 0; i < 3; i++) {
    if (!target[i]) continue;

    for (let j = 0; j < 3; j++) {
      const water = [...target];
      if (i === j) continue;
      if (water[j] === bottle[j]) continue;

      if (water[i] <= bottle[j] - water[j]) {
        water[j] += water[i];
        water[i] = 0;
      } else {
        water[i] -= bottle[j] - water[j];
        water[j] = bottle[j];
      }

      const check = water.join("-");
      if (checkHash.has(check)) continue;

      checkHash.add(check);
      if (!water[0]) answer.add(water[2]);
      queue.push(water);
    }
  }
}

console.log([...answer.values()].sort((a, b) => a - b).join(" "));