n<=100이므로 시간 제한 1초 안에는 n^3까지 가능
=> 단순 구현 문제일 가능성 높음
자료구조 : 원형 리스트가 필요한가?
=> 어떻게 구현하는지도 잘 모르고 문제에서 로봇이 추가되는 지점과 로봇이 나가는 지점이 항상 일정하게 변함.
즉 인덱스의 변화만으로 원형리스트처럼 배열로 풀이 가능
문제 해석이 어려워서 질문게시판을 여러번 정독함 ㅎ
문제에서 설명하는 '과정'을 반복하면서 0의 개수가 K가 되면 종료
문제의 '언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다'를 제대로 생각하지 않고, 과정의 첫번째인 벨트가 회전할 때만 내리게 처리하는 실수를 했다.
하지만 2번의 로봇이 칸을 이동할 때에도 내리는 위치로 이동하는 경우로 처리해줘야한다.
처음엔 start와 end의 인덱스를 변화시키며 저장하였는데, 로봇이 내리는 위치인 mid가 필요하게 되서 다시 계산하는 불필요한 계산이 있었다. 사실 지금 풀이도 맞는 풀이인진 모르겠다
const fs = require("fs");
let [n,k, ...arr] = fs.readFileSync("/dev/stdin")
.toString()
.trim()
.split(/\s/)
.map(Number)
let start = 0;
let mid = n - 1;
let count = 0;
// 각 단계 실행하기
let ans = 0
let box = Array.from({ length: 2 * n - 1 }, e => false)
while (count < k) {
if (start == 0) start = 2 * n - 1
else start--
if (mid == 0) mid = 2 * n - 1
else mid--
//내리기
box[mid] = false
// 로봇 이동하기. curr에 갈 수 있는지 확인
let curr = mid
for (let i = 0; i < n; i++) {
let before = curr === 0 ? 2 * n - 1 : curr - 1
if (arr[curr] > 0 && !box[curr] && box[before]) {
box[curr] = true
arr[curr]--
box[before] = false
if (curr === mid) box[curr] = false
}
curr = before
}
//로봇 올리기
if (!box[start] && arr[start] > 0) {
box[start] = true
arr[start]--
}
count = 0
for (let i = 0; i < 2 * n; i++) {
if (arr[i] === 0) count++
}
ans++
}
console.log(ans)