광규니
광규니네
광규니
전체 방문자
오늘
어제
  • 분류 전체보기 (154)
    • 알고리즘 (100)
      • 알고리즘 개념 (2)
      • 문제 풀이 (96)
    • 주절주절 (19)
      • 자격증, 활동 후기 (4)
      • 전시회 후기 (3)
      • 이모저모 (2)
      • 회고 (3)
      • 뜨럼 (7)
    • 운영체제 (9)
    • 개발 지식 (9)
      • Apple Watch (4)
      • MySQL (2)
      • Eclipse (1)
      • XCode (1)
    • 네트워크 공부 (1)
    • 데이터베이스 공부 (5)
    • Java 공부 (7)
    • TMP (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 합주
  • BOJ
  • 개념
  • 알고리즘
  • 애플워치 앱 만들기
  • 티스토리챌린지
  • 운영체제
  • 구현
  • 다이나믹 프로그래밍
  • 백준
  • 자바
  • 애플워치 앱
  • 프로그래머스
  • 컴퓨터 사이언스
  • BFS
  • DP
  • 파이썬
  • 드린이
  • 오블완
  • OS

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
광규니

광규니네

[Java/자바 20055 백준] 컨베이어 벨트 위의 로봇
알고리즘/문제 풀이

[Java/자바 20055 백준] 컨베이어 벨트 위의 로봇

2022. 1. 5. 13:08
반응형

설명

문제 자체가 어렵진 않지만, 조건이나 설명이 헷갈린 문제였습니다.

컨베이어 벨트이고, N 이후에는 낭떠러지라고 생각하면 됩니다. 순환하는 원형이고 1~N까진 로봇이 존재할 수 있지만, N+1~2N까지는 존재 X

풀이

순서대로 진행하면

1. 과정에서 벨트와 로봇이 움직이게되는데, 이때 내리는 위치에 도달한 로봇은 즉시 내려갑니다. moveBelt()

2. 로봇이 앞에 칸에 내구도가 1이상이며, 로봇이 존재하지 않는다면 앞으로 이동하게 됩니다. 앞에 칸의 내구도는 -1. moveRobot()

3. 올리는 위치에 내구도가 1이상이면 로봇을 올려주고, 내구도를 -1 시켜줍니다. newRobot()

 

2,3번 과정에서 내구도가 -1되는 칸마다 0이 된 칸을 확인해주었습니다.

 

import java.io.*;
import java.util.*;

public class Main{
	static int N, K, left, right, answer;
	static int[] map;
	static boolean[] robot;
	public static void main(String[] args) throws Exception{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st= new StringTokenizer(br.readLine(), " ");
		
		N = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		// 컨베이어 벨트 길이 2*N 
		map = new int[2*N];
		// 로봇 위치 N
		robot = new boolean[N];
		
		st = new StringTokenizer(br.readLine(), " ");
		for(int i = 0 ; i < 2*N ; i++) {
			map[i] = Integer.parseInt(st.nextToken());
		}
		
		left = 0;
		right = N;
		
		while(K>0) {
			answer++;
			moveBelt();
			moveRobot();
			newRobot();
		}
		System.out.println(answer);
	}
	
	private static void moveBelt() {
		left --;
		if(left < 0) {
			left = 2*N -1;
		}
		right --;
		if(right < 0) {
			right = 2*N - 1;
		}
		// 벨트가 움직임에 따라 로봇 위치 재조정 robot은 길이가 N, 0이되는 부분은 밑에서 올라와서 false, N-1도달하면 내리는 위치여서 false;
		for(int i = N-2 ; i > 0 ; i--) {
			robot[i] = robot[i-1];
		}
		robot[0] = false;
		robot[N-1] = false;
	}
	
	private static void moveRobot() {
		// 떨어지는위치 쪽이 올리는 위치보다 먼저 더 로봇이 올라갔으므로 뒤쪽을 먼저 옮겨야한다.
		for(int i = N-2 ; i >= 0 ; i--) {
			// 로봇이 있는 위치
			if(robot[i]) {
				// map배열 기준으로 left + i + 1
				// 로봇배열 기준으로 N-2
				int next = left + i + 1;
				if(next >= 2*N) next -= 2*N;
				
				if(!robot[i+1] && map[next] >=1) {
					robot[i] = false;
					if(i+1 < N-1) robot[i+1] = true;
					
					map[next] --;
					if(map[next] == 0) K--;
				}
			}
		}
	}
	
	private static void newRobot() {
		if(map[left] > 0) {
			robot[0] = true;
			map[left] --;
			if(map[left] == 0) K--;
		}
	}
}

ref) 

https://jellyinghead.tistory.com/69 - 참고하면서 이해가 잘 가지 않은 부분은 리팩토링 진행했습니다.

반응형
저작자표시 (새창열림)

'알고리즘 > 문제 풀이' 카테고리의 다른 글

[Java/자바 20056 백준] 마법사 상어와 파이어볼  (0) 2022.01.06
[Java/자바 백준 1520] 내리막 길  (0) 2022.01.05
[Java/자바 백준 19238] 스타트 택시  (0) 2022.01.04
[Java/자바 백준 2589] 보물섬  (0) 2022.01.03
[Java/자바 백준 14503] 로봇 청소기  (0) 2022.01.03
    '알고리즘/문제 풀이' 카테고리의 다른 글
    • [Java/자바 20056 백준] 마법사 상어와 파이어볼
    • [Java/자바 백준 1520] 내리막 길
    • [Java/자바 백준 19238] 스타트 택시
    • [Java/자바 백준 2589] 보물섬
    광규니
    광규니
    공부 및 일상 올리기~

    티스토리툴바