Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 플로이드 워셜
- 동기화
- 뮤텍스란?
- 서버 호스팅
- 다익스트라
- 최단 경로
- 웹 호스팅
- 플로이드 와샬
- 삼성 청년 SW 아카데미
- 세마포어와 뮤텍스
- 싸피 면접 후기
- 세마포어
- 세마포어와 뮤텍스의 차이
- 호스팅
- SSAFY
- Dijkstra Algorithm
- 클라우드 서버
- Proxy
- 다익스트라 알고리즘
- Proxy Server
- 뮤텍스
- 싸피 합격
- 프록시
- floyd-warshall
- Synchronization
- 세마포어란?
- 호스팅이란?
- 싸피
- 프록시서버
Archives
- Today
- Total
어제의 나보다 성장한 오늘의 나
[백준][20055][Java] 컨베이어 벨트 위의 로봇 본문
www.acmicpc.net/problem/20055
문제풀이
1. 컨베이어 벨트 값을 저장하고 %를 이용하여 이동시켜주면된다.
2. 로봇이 있는 장소를 저장하는 배열과 로봇의 순서와 자리를 기억하는 List를 선언
3. 조건에 맞게 차례대로 구현한다.
여기서 주의사항이 컨베이어 벨트를 회전 했을때 로봇에 내려가는 위치에 당도 했다면 로봇을 내려줘야한다.
또 같이 컨베이어 벨트의 회전이 끝나고 로봇이 이동할 때에도 내려가는 위치에 당도 하면 내려줘야 한다.
코드
import java.io.*;
import java.util.*;
import jdk.internal.util.xml.impl.Input;
public class Main {
static int N, K, zeroCnt;
static List<Integer> list;
static int[] conveNum;
static boolean[] conveVisited;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
list = new ArrayList<>();
conveNum = new int[N*2];
conveVisited = new boolean[N];
st = new StringTokenizer(br.readLine());
for(int i=0; i<N*2; i++) {
conveNum[i] = Integer.parseInt(st.nextToken());
if(conveNum[i]==0) zeroCnt++;
}
int index =0;
while(true) {
index ++;
//벨트 칸 이동
conveMove();
robotMove();
onRobotCheck();
if(zeroCnt <= K) break;
}
System.out.println(index);
}
private static void onRobotCheck() {
//올라가는 위치에 로봇 올리기
if(conveNum[0] !=0 && conveVisited[0] == false) {
conveNum[0]--;
if(conveNum[0] == 0) zeroCnt++;
conveVisited[0] = true;
list.add(0);
}
}
private static void robotMove() {
for(int i=0; i<list.size(); i++) {
int index = list.get(i);
// 로봇이 이동 가능한 경우
if(conveNum[index+1] !=0 && conveVisited[index+1] == false) {
conveNum[index+1]--;
if(conveNum[index+1] == 0) zeroCnt++;
conveVisited[index] = false;
//내려오는 자리 오면 삭제
if(index+1 == N-1) {
list.remove(i--);
conveVisited[N-1] = false;
}
else {
conveVisited[index+1] = true;
list.set(i, index+1);
}
}
}
}
private static void conveMove() {
int temp = conveNum[(N*2)-1];
// 컨베이어 벨트 이동
for(int i=(N*2)-1; i>0; i--) conveNum[i] = conveNum[i-1];
// 컨베이어 위에 있는 로봇 이동
for(int i=N-1; i>0; i--) conveVisited[i] = conveVisited[i-1];
conveNum[0] = temp;
conveVisited[0] = false;
conveVisited[N-1] = false;
// 실질적으로 로봇 위치를 저장한 list도 1씩 증가
for(int i=0; i<list.size(); i++) {
int index = list.get(i);
if(index+1 == N-1) list.remove(i--);
else list.set(i, index+1);
}
}
}
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
[백준][13458][Java] 시험 감독 (0) | 2021.01.12 |
---|---|
[백준][14888][Java] 연산자 끼워넣기 (0) | 2021.01.11 |
[백준][14499][Java] 주사위 굴리기 (0) | 2021.01.07 |
[백준][20056][Java] 마법사 상어와 파이어볼 (1) | 2021.01.05 |
[프로그래머스][Level2][Java] 피보나치 수 (0) | 2020.12.28 |
Comments