[JS|구현 알고리즘] 백준 1244번. 스위치 켜고 끄기

2024. 4. 13. 01:36·💾 자료구조 & 알고리즘/문제 풀이

 


 

 

 

1244번: 스위치 켜고 끄기

첫째 줄에는 스위치 개수가 주어진다. 스위치 개수는 100 이하인 양의 정수이다. 둘째 줄에는 각 스위치의 상태가 주어진다. 켜져 있으면 1, 꺼져있으면 0이라고 표시하고 사이에 빈칸이 하나씩

www.acmicpc.net

 

입력과 출력

  • 입력
    • 첫째 줄, 스위치 개수 : SwitchNum
    • 두번째 줄, 스위치 상태 : SArr → [0, 1, 0, 1, 0, 0, 0, 1] 등의 형태로 정제
    • 세번째 줄, 학생 수 : StudentNum → 사용하지 않기에 _으로 표시
    • 네번째 줄~ 학생 수만큼, 성별과 받은 수 표시 : Gender , InputN
  • 출력
    • 20개씩 끊어서 한 줄로 스위치 최종 상태 출력하기

 

 

문제 풀이 로직

  • 먼저 입력값을 문제 풀이에 맞게 정제하고, 남학생 로직과 여학생 로직을 나눠서 구현하였다.
  • 남학생 로직 : if(gender == 1){}
    • 반복문을 돌면서 스위치 번호가 남학생이 받은 숫자의 배수인 경우에만 스위치 상태 변경
      • i를 1부터 시작해야 곱셈사용이 편함
      • n * i를 조건문에 한 번 더 씀으로써 정확히 스위치 갯수 이내의 경우만 확인
      • 상태 변경 ( 0을 1로, 1을 0으로) : Math.abs(SArr[n * i - 1] - 1)
      for (let i = 1; n * i <= SwitchNum; i++) {
        SArr[n * i - 1] = Math.abs(SArr[n * i - 1] - 1)
      }
      

 

  • 여학생 로직 : else {}
    1. 본인 숫자에 해당하는 스위치 상태 변경
    2. While문 돌면서 대칭하는 구간 찾기 (헬퍼변수 LeftN, RightN 사용)
      • While 조건 : LeftN이 0 이상이거나 RightN이 SwitchNum 이하일때만 반복문 수행
      • if 문 : 만약 양 옆의 스위치 상태가 같다면 상태 변경, 다르다면 break (return 썼다가 실패뜸ㅜ)
        • 중첩 if문 : 양 옆 스위치가 대칭일 때 0이면 1로, 1이면 0으로 변경 (한 번에 바꿀 방법 못 찾음)
    let [LeftN, RightN] = [n - 2, n]
    
    SArr[n - 1] = Math.abs(SArr[n - 1] - 1)
    
    while (LeftN >= 0 || RightN <= SwitchNum) {
      if (SArr[LeftN] === SArr[RightN]) {
        if (SArr[LeftN] === 0) {
          SArr[LeftN] = 1
          SArr[RightN] = 1
        } else {
          SArr[LeftN] = 0
          SArr[RightN] = 0
        }
        LeftN -= 1
        RightN += 1
      } else break
    }
    

 

  • 출력 로직
    • 사실상 마지막 출력에서 실패가 많이 뜸.
    • 여러 경우의 수로 써보다가 그냥 20개씩 잘라서
    • 새 배열에 [ [0~20], [21~40], [41~60], … ] 형태로 저장하기로 함
    • 배열을 문자열로 출력하는 join() 메소드 사용. 각 요소를 \n을 사용하여 출력

 

전체코드

let fs = require('fs')
const path = process.platform === 'linux' ? '/dev/stdin' : 'input.txt'
let [SwitchNum, SArr, _, ...StudentArray] = fs
  .readFileSync(path)
  .toString()
  .trim()
  .split('\\n')
SArr = SArr.split(' ').map((v) => v * 1)
StudentArray = StudentArray.map((v) => v.split(' '))
let result = ''

StudentArray.map(([Gender, InputN]) => {
  let gender = Gender * 1
  let n = InputN * 1

  // 남학생
  if (gender == 1) {
    for (let i = 1; n * i <= SwitchNum; i++)
      SArr[n * i - 1] = Math.abs(SArr[n * i - 1] - 1)
  }

  // 여학생
  else {
    let [LeftN, RightN] = [n - 2, n]

    SArr[n - 1] = Math.abs(SArr[n - 1] - 1)

    while (LeftN >= 0 || RightN <= SwitchNum) {
      if (SArr[LeftN] === SArr[RightN]) {
        if (SArr[LeftN] === 0) {
          SArr[LeftN] = 1
          SArr[RightN] = 1
        } else {
          SArr[LeftN] = 0
          SArr[RightN] = 0
        }
        LeftN -= 1
        RightN += 1
      } else break
    }
  }
})

let resultArr = []
for (let i = 0; i < SArr.length; i += 20) {
  resultArr.push(SArr.slice(i, i + 20).join(' '))
}

console.log(resultArr.join('\\n'))

'💾 자료구조 & 알고리즘/문제 풀이' 카테고리의 다른 글
  • [JS|구현 알고리즘] 백준 2615번. 오목
  • [JS|구현 알고리즘] 백준 17413번. 단어 뒤집기 2
  • [JS|구현 알고리즘] 백준 3474번. 교수가 된 현우
  • [배열] 백준 10818번. 최소,최대
상심한 개발자
상심한 개발자
  • 상심한 개발자
    상심한 개발자
    상심한 개발자
  • 전체
    오늘
    어제
    • 상심한 개발자 (36)
      • 📝 공부 기록 (4)
        • Javascript (3)
        • CS (1)
        • NodeJS (0)
      • 💻 개발 기록 (1)
        • Sring, 스터디 모집 및 관리 기능 통합 서비.. (1)
      • 💾 자료구조 & 알고리즘 (26)
        • 이론 정리 (13)
        • 문제 풀이 (13)
      • 📝 후기 및 회고록 (4)
      • etc. (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자료구조
    배열
    array
    블로그
    삽질기록
    JavaScript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
상심한 개발자
[JS|구현 알고리즘] 백준 1244번. 스위치 켜고 끄기
상단으로

티스토리툴바