[알고리즘] 1244번 - 스위치 켜고 끄기 (구현, 시뮬레이션)

POLO·2024년 10월 5일

풀이

다른 것보다 지문을 이해하기가 조금 어려웠다. 사진이 없었다면 이해하지 못해서 틀렸을문제다.
여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다. 이때 구간에 속한 스위치 개수는 항상 홀수가 된다. 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서라고 되어있는데, 이부분은 차라리 제외하고 여학생이 받은 번호를 부터 시작해 좌우로 스위치를 비교해 가면서 상태가 동일한 경우 바꾸고, 아닌 경우 더 이상 바꾸지 않는다.를 지문으로 넣는 게 더 나았을 거다.

여기에서 실수했던 건 changeStatusByBoy 안의 for문 작성 시 배수를 구하는 부분에서 였는데, 배수를 구할거면 boysNumber * i를 했어야 했는데, 초반에 i=boysNumber이라고 잘못 지정하고 답을 내는 바람에 실패했다.

알고리즘을 규칙적으로 풀지 않아서 그런지 머리가 잘 안 돌아가는 느낌..

솔직히 하기 싫다..

포케나 팔고 싶다고!!!!!!!!

코드

const input = require("fs")
  .readFileSync("/dev/stdin")
  .toString()
  .trim()
  .split("\n");
const sw = Number(input[0]);
let status = input[1].split(" ").map(Number);
let students = Number(input[2]);


const changeStatusByBoy = (boysNumber) => {
  for (let i = 1; i * boysNumber <= sw; i++) {
    status[i * boysNumber - 1] = status[i * boysNumber - 1] === 1 ? 0 : 1;
  }
};

const changeStatusByGirls = (girlsNumber) => {
  status[girlsNumber - 1] = status[girlsNumber - 1] === 1 ? 0 : 1;
  let leftPointer = girlsNumber - 2;
  let rightPointer = girlsNumber;
  while (leftPointer >= 0 && rightPointer < sw) {
    if (status[leftPointer] !== status[rightPointer]) break;
    status[leftPointer] = status[rightPointer] =
      status[leftPointer] === 1 ? 0 : 1;
    leftPointer--;
    rightPointer++;
  }
};

let curStudentIndex = 1;
while (students--) {
  const [sex, number] = input[2 + curStudentIndex++].split(" ").map(Number);
  if (sex === 1) changeStatusByBoy(number);
  else changeStatusByGirls(number);
}

for (let i = 0; i < Math.ceil(sw / 20); i++) {
  console.log(status.slice(i * 20, i * 20 + 20).join(" "));
}

0개의 댓글