[백준] 1244번 : 스위치 켜고 끄기 (node.js)

Jo Chang Uk·2024년 5월 9일

1. 문제

문제 링크

2. 풀이

2.1 생각해 볼 만한 케이스

  • 성별에 따른 케이스
  • 출력의 스위치가 20개 이상이면 줄바꿈
  • 여학생일때 받은 수 기준으로 좌우가 대칭

2.2 Array.prototype.join()

출력에서 많이 틀렸는데 join() 메서드에 익숙하지 않은거 같다.
join() 메서드는 배열의 모든 요소를 쉼표나 지정된 구분 문자열로 구분하여 연결한 새 문자열을 만들어 반환합니다.

let arr = ['사과', '바나나', '수박'];
	
let arrJoin1 = arr.join();
console.log(arrJoin1); // 사과,바나나,수박

let arrJoin2 = arr.join('');
console.log(arrJoin2); // 사과바나나수박

let arrJoin3 = arr.join('-');
console.log(arrJoin3); // 사과-바나나-수박

let result = [];
let arr = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23];

while (arr.length > 0) {
  // 20개까지 자른 배열을 한칸 씩 띄운 문자열을 result에 push
  result.push(arr.splice(0, 20).join(" "));
  console.log("result", result);
}
// 배열 사이를 띄워서 하나의 문자열로 반환
console.log(result.join("\n"));
// 결과
// result [ '0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19' ]
// result [ '0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19', '20 21 22 23' ]
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// 20 21 22 23

splice() 메소드는 원본을 깍아 먹기 때문에 arr.length가 0이 될때 까지 반복한다.

2.3 제출 코드

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


const n = +input.shift();
// 스위치 상태
const states = input[0].split(" ").map(Number);
// 학생 수
const studentNum = +input[1];
// 학생 리스트
const studentList = input
  .filter((v, i) => i > 1)
  .map((v) => v.split(" ").map(Number));

// 스위치 토글
function toggle(state) {
  return state === 0 ? 1 : 0;
}

function solution(n, states, studentNum, studentList) {
  for (let i = 0; i < studentNum; i++) {
    let gender = studentList[i][0];
    let stuNum = studentList[i][1];
    if (gender === 1) {
      // 남학생일때 배수를 찾아 토글
      for (let i = 1; i <= parseInt(n / stuNum); i++) {
        let target = i * stuNum - 1;
        states[target] = toggle(states[target]);
      }
    } else {
      // 여학생 일때 
      let flag = 0;
      // 학생이 받은 수 스위치 토글
      states[stuNum - 1] = toggle(states[stuNum - 1]);
      // 학생이 받은 수의 왼쪽 오른쪽
      let rt = stuNum;
      let lt = stuNum - 2;
      // 끝에 도착하거나, 대칭이 아닐때 멈춤
      while (flag === 0 && lt >= 0 && rt <= n) {
        if (states[rt] === states[lt]) {
          // 대칭일때 스위치 토글
          states[rt] = toggle(states[rt]);
          states[lt] = toggle(states[lt]);
          // 이동
          rt++;
          lt--;
        } else flag = 1;
      }
    }
  }

  // 20개 이상일때 출력
  let result = [];
  while (states.length > 0) {
    result.push(states.splice(0, 20).join(" "));
  }
  console.log(result.join("\n"));
}

solution(n, states, studentNum, studentList);

0개의 댓글