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 {}
- 본인 숫자에 해당하는 스위치 상태 변경
- 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'))