입력과 출력
- 입력
- 컨베이어 벨트의 길이 N
- 내구도 0인 칸의 최대 갯수 K
- 2N 길이의 컨베이어 벨트의 각 칸의 내구도 conArr
- 출력
- 정해진 단계별 과정에 맞춰 컨베이어 벨트와 로봇을 움직이다가 컨베이어 벨트에서 내구도가 0인 칸의 개수가 K 일 때, 진행되고 있던 단계 출력 stepCnt
문제 풀이 로직
- 헬퍼 변수 설명
- robotArr : 각 칸에 로봇이 있는 지 저장하는 용도의 배열
- zeroCnt : 각 단계가 끝날 때마다 계산한 내구도가 0인 칸의 개수
- while 문을 돌며 단계 진행 → 만약, zeroCnt가 K와 같다면 반복문 break
- 먼저, 컨베이어벨트 한 칸씩 회전
- 내구도 배열 conArr 회전
- 로봇 위치 배열 robotArr 회전
- findIdxArray : 로봇 위치 배열을 탐색하면서 로봇이 있는 위치들을 저장
- 찾은 로봇 위치 배열의 역 순(컨베이어 벨트 끝)부터 로봇 한 칸씩 이동하기
- 만약에 로봇이 첫 번째 줄 끝(N-1)에 있다면 내구도 유지, 로봇 내보내기
- 그렇지 않고, 다음 칸으로 이동할 수 있는 로봇이라면 한 칸 이동
- 현재 칸 → 다음 칸 로봇 이동: 만약 다음 칸이 마지막 칸이라면 이동 후 로봇 그대로 내보내기
- robotArr[idx] = 0 robotArr[idx + 1] = idx + 1 !== N - 1 ? 1 : 0
- 다음 칸 내구도 -1
- 만약 로봇을 올리는 위치(robotArr[0])의 내구도가 1 이상이고, 로봇이 없다면 새로운 로봇 올리기 (내구도 -1 : conArr[0] - 1)
- if (conArr[0] > 0 && !robotArr[0]) { robotArr[0] = 1 conArr[0] -= 1 }
- 내구도가 0인 칸의 개수(zeroCnt)를 세서 K 이상이라면 반복문 종료.
- 진행중이던 단계(stepCnt) 출력
- 먼저, 컨베이어벨트 한 칸씩 회전
전체 코드
let [[N, K], [...conArr]] = require('fs')
.readFileSync(process.platform === 'linux' ? 'dev/stdin' : 'input.txt')
.toString()
.trim()
.split('\\n')
.map((v) => v.split(' ').map(Number))
let robotArr = new Array(N).fill(0)
let stepCnt = 1
while (true) {
conArr.unshift(conArr.pop())
robotArr.unshift(robotArr.pop())
let findIndex = robotArr.indexOf(1) // 첫 번째 위치
let findIdxArr = []
while (findIndex != -1) {
findIdxArr.push(findIndex)
findIndex = robotArr.indexOf(1, findIndex + 1)
}
findIdxArr.reverse().map((idx) => {
if (idx === N - 1) {
robotArr[idx] = 0
} else if (conArr[idx + 1] > 0 && robotArr[idx + 1] !== 1) {
robotArr[idx + 1] = idx + 1 !== N - 1 ? 1 : 0
conArr[idx + 1] -= 1
robotArr[idx] = 0
}
})
if (conArr[0] > 0 && !robotArr[0]) {
robotArr[0] = 1
conArr[0] -= 1
}
let zeroCnt = conArr.reduce((acc, cur) => (cur === 0 ? acc + 1 : acc), 0)
if (zeroCnt >= K) break
stepCnt++
}
console.log(stepCnt)