본문 바로가기
Algorithm/백준

백준 카드 섞기 1091번 javacript

by eclipse7727 2022. 7. 4.

 

 

1091번: 카드 섞기

지민이는 카지노의 딜러이고, 지금 3명의 플레이어(0, 1, 2)가 있다. 이 게임은 N개의 카드를 이용한다. (0 ~ N-1번) 일단 지민이는 카드를 몇 번 섞은 다음에, 그것을 플레이어들에게 나누어 준다. 0

www.acmicpc.net

1. 첫 번째 줄에 카드 개수 N 을 입력받는다.

2. 두 번째 줄에 현재 카드들의 상태 P 를 입력받는다.

3. 세 번째 줄에 카드를 섞는 방법 S를 입력받는다.

문제의 예제 1번의 결과

 

문제 이해하는 데 시간이 오래 걸렸다.
그 외에는 시간제한도 없고, 어려운 함정도 없어 편하게 풀었던 문제였다.

 

사이클의 경우 어차피 카드 섞는 법은 똑같기 때문에 첫번째와 같은 숫자가 나오면 사이클이 된다고 할 수 있다.

const fs = require("fs");
const stdin = (
  process.platform === "linux"
    ? fs.readFileSync("/dev/stdin").toString()
    : `12
    1 1 2 0 2 0 1 0 2 2 1 0
    5 0 9 7 1 8 3 10 4 11 6 2`
).split("\n");

const input = (() => {
  let line = 0;
  return () => stdin[line++];
})();

// 사람 수
const N = +input();

// 어느 플레이어에게 가야하는지
let P = input()
  .trim()
  .split(" ")
  .map((v) => +v);

// i번째 위치에 있던 카드는 S[i]
let S = input()
  .trim()
  .split(" ")
  .map((v) => +v);

const suffle = (P, S) => {
  let newP = new Array(N);
  for (let i = 0; i < N; i++) {
    newP[S[i]] = P[i];
  }
  return newP;
};

const firstP = [...P];

const checker = (P) => {
  for (let i = 0; i < P.length; i++) {
    const index = i % 3;
    if (index !== P[i]) {
      return false;
    }
  }
  return true;
};

let count = 0;
if (!checker(P)) {
  while (true) {
    count += 1;
    const result = suffle(P, S);
    // console.log(result);
    P = result;
    if (P.join() === firstP.join()) {
      count = -1;
      break;
    }
    if (checker(P)) {
      break;
    }
  }
}
console.log(count);
반응형

'Algorithm > 백준' 카테고리의 다른 글

백준 교환 1039 javascript  (0) 2022.07.14
백준 테트로미노 14500 javascript  (0) 2022.07.14
백준 오목 2072번 python  (0) 2022.07.01
백준 1253번 좋다 python  (0) 2022.07.01
백준 도서관 1461 python  (0) 2022.06.30

댓글