[JS|구현 알고리즘] 백준 20055번. 컨베이어 벨트 위의 로봇

2024. 5. 18. 05:52·💾 자료구조 & 알고리즘/문제 풀이

 


 

 

입력과 출력

  • 입력
    • 컨베이어 벨트의 길이 N
    • 내구도 0인 칸의 최대 갯수 K
    • 2N 길이의 컨베이어 벨트의 각 칸의 내구도 conArr
  • 출력
    • 정해진 단계별 과정에 맞춰 컨베이어 벨트와 로봇을 움직이다가 컨베이어 벨트에서 내구도가 0인 칸의 개수가 K 일 때, 진행되고 있던 단계 출력 stepCnt

문제 풀이 로직

  • 헬퍼 변수 설명
    • robotArr : 각 칸에 로봇이 있는 지 저장하는 용도의 배열
    • zeroCnt : 각 단계가 끝날 때마다 계산한 내구도가 0인 칸의 개수
  • while 문을 돌며 단계 진행 → 만약, zeroCnt가 K와 같다면 반복문 break
    1. 먼저, 컨베이어벨트 한 칸씩 회전  
      • 내구도 배열 conArr 회전
      • 로봇 위치 배열 robotArr 회전
    2. findIdxArray : 로봇 위치 배열을 탐색하면서 로봇이 있는 위치들을 저장
      • 찾은 로봇 위치 배열의 역 순(컨베이어 벨트 끝)부터 로봇 한 칸씩 이동하기
      • 만약에 로봇이 첫 번째 줄 끝(N-1)에 있다면 내구도 유지, 로봇 내보내기
      • 그렇지 않고, 다음 칸으로 이동할 수 있는 로봇이라면 한 칸 이동
        • 현재 칸 → 다음 칸 로봇 이동: 만약 다음 칸이 마지막 칸이라면 이동 후 로봇 그대로 내보내기
        • robotArr[idx] = 0 robotArr[idx + 1] = idx + 1 !== N - 1 ? 1 : 0
        • 다음 칸 내구도 -1 
    3. 만약 로봇을 올리는 위치(robotArr[0])의 내구도가 1 이상이고, 로봇이 없다면 새로운 로봇 올리기 (내구도 -1 : conArr[0] - 1)
      • if (conArr[0] > 0 && !robotArr[0]) { robotArr[0] = 1 conArr[0] -= 1 }
    4. 내구도가 0인 칸의 개수(zeroCnt)를 세서 K 이상이라면 반복문 종료.
    5. 진행중이던 단계(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)

'💾 자료구조 & 알고리즘/문제 풀이' 카테고리의 다른 글
  • [JS|해시] 프로그래머스 42576번. 완주하지 못한 선수
  • [JS|구현 알고리즘] 백준 14719번. 빗물
  • [JS|구현 알고리즘] 백준 2615번. 오목
  • [JS|구현 알고리즘] 백준 17413번. 단어 뒤집기 2
상심한 개발자
상심한 개발자
  • 상심한 개발자
    상심한 개발자
    상심한 개발자
  • 전체
    오늘
    어제
    • 상심한 개발자 (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|구현 알고리즘] 백준 20055번. 컨베이어 벨트 위의 로봇
상단으로

티스토리툴바