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
- 알고리즘 그래프
- 자바스크립트 이벤트중지
- java lambda
- 자바 재귀 조합
- jquery dom 계층 선택자
- 재귀
- 자바
- Java
- char to str
- parseInt()
- 재귀함수
- inner class
- jquery 필터선택자
- 알고리즘
- Interface
- jquery 이벤트 처리
- jquery 속성선택자
- 상속
- 순열 재귀
- 자바 순열 코드
- 조합 재귀
- 후위표기
- 자바 조합 재귀
- str to char array
- 자바입출력
- java Collections.sort()
- 서로소
- java 내부 클래스
- 순열코드
- 자바스크립트 이벤트처리
Archives
- Today
- Total
유블로그
[Java] BOJ 20055 컨베이어 벨트 위의 로봇 본문
[Java] BOJ 20055 컨베이어 벨트 위의 로봇
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_20055_컨베이어벨트위의로봇 {
static class Block {
int x;
boolean isRobot;
public Block(int x, boolean isRobot) {
this.x = x;
this.isRobot = isRobot;
}
}
static int N, K;
static Block[] A;
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());
A = new Block[N*2];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N*2; i++) {
A[i] = new Block(Integer.parseInt(st.nextToken()), false);
}
System.out.println(solve());
} // main
private static int solve() {
int ANSWER = 1;
while(true) {
if(isEnd()) break;
// 1. 회전
Block tmp = A[2*N-1];
for (int i = 2*N-1; i > 0; i--) {
A[i] = A[i-1];
}
A[0] = tmp;
// 2. 로봇있다면 이동
if(A[N-1].isRobot) A[N-1].isRobot = false;
for (int i = N-2; i >= 0; i--) {
if(!A[i].isRobot) continue;
if(!A[i+1].isRobot && A[i+1].x > 0) {
A[i+1].isRobot = true;
A[i+1].x--;
A[i].isRobot = false;
}
}
if(isEnd()) break;
if(A[N-1].isRobot) A[N-1].isRobot = false;
// 3. 올라가는 위치에 로봇 없다면 로봇 올리기
if(!A[0].isRobot && A[0].x > 0) {
A[0].isRobot = true;
A[0].x--;
}
if(isEnd()) break;
ANSWER++;
} // while
return ANSWER;
} // solve
static boolean isEnd() {
int cnt = 0;
for (int i = 0; i < 2*N; i++) {
if(A[i].x == 0) cnt++;
if(cnt >= K) return true;
}
return false;
}
}
처음에 문제를 이해한다고 실버문제치고 시간이 꽤 걸렸다... 하하
로봇을 건너편으로 보낸다는 게 땅에 도착하기만 하면 되는 건지.. 그리고 단계가 step의 개념인지 stage의 개념인지.. 그런.. 애매모호함.. 등등
어쨌든 문제가 시키는 대로만 진행하면 된다.
1, 2, 3 진행 하나를 1단계라고 하는 것이니 첫단계는 int ANSWER = 1;
각 1, 2, 3 과정 할 때 내구성 0 생기니까 계속 체크해주고 0이 K 이상되면 바로 끝내면 된다.
while 문을 돌면서
먼저 1. 회전 => 단지 1차원배열을 오른쪽으로 돌리는 일.
2. 로봇이 있다면 이동.
나는 배열을 0 ~ 2*N-1 로 잡아서
N-1 위치에 로봇이 있으면 내려갈 차례이니 robot 을 없애주었다.
그리고 N-2 부터 0 까지 하나씩 줄이면서 로봇이 있으면 다음 위치 로봇이 없고 내구성 1이상 일 때 옮겨주었다.
2번 하기 전, 후 땐 벨트 N-1위치에 있는 것들을 모두 false 시켜준다.
3. 로봇 올리기
배열 0 인덱스에서만 로봇을 올릴 수 있으니 0 인덱스에 로봇이 없는 상태이고 내구성 1 이상일 때 로봇 올린다.
'알고리즘' 카테고리의 다른 글
[Java] BOJ 19237 어른상어 (0) | 2021.04.25 |
---|---|
[Java] BOJ 19236 청소년상어 (0) | 2021.04.24 |
[Java] BOJ 20056 마법사 상어와 파이어볼 (0) | 2021.04.23 |
[Java] swea 1949 등산로조성 (0) | 2021.04.22 |
[Java] swea 1952 수영장 (0) | 2021.04.22 |