Algorithm

[Baekjoon]1544번 사이클 단어 - Javascript

호밀이 2024. 2. 14. 23:59

https://www.acmicpc.net/problem/1544

 

1544번: 사이클 단어

사이클 단어는 어떤 단어를 원형 모양으로 차례대로 쓴 것이다. 따라서, 어떤 단어를 이렇게 쓴 후에 임의의 단어를 고른다. 그 후에 시계방향으로 차례대로 읽으면 그 것이 단어가 된다. 만약에

www.acmicpc.net

문제

사이클 단어는 어떤 단어를 원형 모양으로 차례대로 쓴 것이다. 따라서, 어떤 단어를 이렇게 쓴 후에 임의의 단어를 고른다. 그 후에 시계방향으로 차례대로 읽으면 그 것이 단어가 된다. 만약에 단어 A와 단어 B가 있을 때, 단어 B를 원형으로 써서, 단어 A와 같이 읽을 수 있으면, 두 단어는 같은 단어이다. 따라서, picture와 turepic은 같은 단어다.

N개의 단어가 주어졌을 때, 서로 다른 단어가 총 몇 개인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 개수 N이 주어진다. 둘째 줄부터 단어가 한 줄에 하나씩 주어진다. 단어는 영어 소문자로만 이루어져 있다. N은 50보다 작거나 같은 자연수이며, 단어의 길이는 최대 50이다.

출력

첫째 줄에 서로 다른 단어가 몇 개인지 출력한다.

예제 입력 1 복사

5
picture
turepic
icturep
word
ordw

예제 출력 1 복사

2

예제 입력 2 복사

7
ast
ats
tas
tsa
sat
sta
ttt

예제 출력 2 복사

3

 

문제풀이(1)

브루트포스 문제이다.
1. i번째 단어를 입력받으면 해당 단어로 만들 수 있는 모든 경우의 수를 만든다.
2. 이전에 만들어진 모든 회전들과 현재 문자열의 회전들을 비교하여, 현재 문자열이 새로운 회전을 만들었는지 확인한다.
3. 만약 현재 문자열이 새로운 회전을 만들었다면, 카운트를 증가시킨다.

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

const n = Number(input[0]);
const rotations = Array.from({ length: n }, () => []);

let count = 0;

for (let i = 0; i < n; i++) {
  const current = input[i + 1];

  const currentRotations = Array.from({ length: current.length }, (_, j) => current.slice(j) + current.slice(0, j));

  const isUnique = rotations
    .slice(0, i)
    .every((prevRotations) => !prevRotations.some((prev) => currentRotations.includes(prev)));

  if (isUnique) {
    count++;
  }

  rotations[i] = currentRotations;
}

console.log(count);