알고리즘 연습

[알고리즘 연습] 백준 6443 (애너그램, 자바스크립트)

산본개발자 2023. 7. 3. 19:19

문제

 

6443번: 애너그램

첫째 줄에 단어의 개수 N 이, 둘째 줄부터 N개의 영단어가 들어온다. 영단어는 소문자로 이루어져 있다. 단어의 길이는 20보다 작거나 같고, 애너그램의 수가 100,000개 이하인 단어만 입력으로 주

www.acmicpc.net


소스 코드

const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
const input = require("fs")
  .readFileSync(filePath)
  .toString()
  .trim()
  .split("\n");

const N = +input[0];
const words = [];
let result = [];
let answer = "";
let visited;

for (let i = 1; i <= N; i++) words.push(input[i].trim().split("").sort());

for (const word of words) {
  result = [];
  visited = new Array(word.length).fill(false);

  dfs(word, "", 0);

  if (answer !== "") answer += "\n";
  answer += result.join("\n");
}

console.log(answer);

function dfs(word, str, idx) {
  if (idx === word.length) {
    result.push(str);
    return;
  }

  for (let i = 0; i < word.length; i++) {
    if (
      result.length !== 0 &&
      result[result.length - 1].slice(0, idx + 1) === str + word[i]
    )
      continue;
    if (visited[i]) continue;

    visited[i] = true;
    dfs(word, str + word[i], idx + 1);
    visited[i] = false;
  }
}