티스토리 뷰
// 알고리즘
1. 시뮬레이션
2. 컨베이어 벨트 위 / 아래 각각 한개씩 배열을 생성
3. 컨베이어벨트 이동함수 ( moveC ) 작성
4. 로봇 이동함수 (moveR) 작성
-> 로봇은 방문배열v 하나만 구현하면 됨. (위 배열만 필요 함.)
5. 계산
-> 횟수 1 증가
-> moveC
-> moveR
-> 올라가는 곳 (uArr[0] ) 확인 해서 로봇올리기
-> 위 / 아래 배열에서 내구도가 0인 개수 확인
더보기
import java.util.*;
import java.io.*;
public class 컨베이어벨트_20055 {
static int N, K, uArr[], dArr[], ans;
static boolean[] v;
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());
uArr = new int[N];
v = new boolean[N];
dArr = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
uArr[i] = Integer.parseInt(st.nextToken());
}
for (int i = N - 1; i >= 0; i--) {
dArr[i] = Integer.parseInt(st.nextToken());
}
cal();
System.out.println(ans);
}
private static void cal() {
while (true) {
ans++;
moveC();
moveR();
if (uArr[0] > 0) {
uArr[0]--;
v[0] = true;
}
if (check())
return;
}
}
private static void moveR() {
v[N - 1] = false;
for (int i = N - 2; i >= 0; i--) {
if (v[i]) {
if (uArr[i + 1] > 0 && !v[i+1]) {
v[i] = false;
v[i + 1] = true;
uArr[i + 1]--;
}
}
}
}
private static void moveC() {
int uTmp = uArr[N - 1];
int dTmp = dArr[0];
// 위
for (int i = N - 2; i >= 0; i--) {
uArr[i + 1] = uArr[i];
v[i+1] = v[i];
}
uArr[0] = dTmp;
v[0] = false;
// 아래
for (int i = 1; i < N; i++) {
dArr[i - 1] = dArr[i];
}
dArr[N - 1] = uTmp;
}
private static boolean check() {
int cnt = 0;
for (int i = 0; i < N; i++) {
if (uArr[i] == 0)
cnt++;
if (dArr[i] == 0)
cnt++;
}
if (cnt >= K)
return true;
return false;
}
}
※ 알고리즘 구현하는 시간은 짧았으나 문제를 이해하는데 생각보다 시간이 오래 걸림. 시뮬레이션 문제를 더 많이 풀어봐야할거같다.
'Algorithm' 카테고리의 다른 글
백준_스타트 링크_5014 (0) | 2021.03.06 |
---|---|
백준_암호 만들기_1759 (0) | 2021.03.04 |
백준_줄 세우기_2252 (0) | 2021.02.23 |
백준_가운데를 말해요_1655 (0) | 2021.02.14 |
백준_부분 합_1806 (0) | 2021.02.07 |