728x90
이 문제는 현재 위치에서 위로 올라갈 수 있는지를 판단해서 올라가는 구현 문제이다.
현재 위치에서 다음 계단으로 올라갈 수 있는 경우는 이렇게 3가지가 있다.
문제 풀이
- 현재위치에서 다음 위치로 올라갈 수 있으면 계속 올라간다.
- 계단을 이동시켜준다. (이동 끝점에 도착하면 방향을 바꿔준다.)
이동하기
이렇게 계속 진행해주다가 최고점에 도달하면 종료시켜준다.
전체 코드
더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static class cam {
int x;
int y;
int d;
public cam(int x, int y,int d) {
super();
this.x = x;
this.y = y;
this.d=d;
}
}
static int n,l,result;
static cam num[];
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n=Integer.parseInt(st.nextToken());
l=Integer.parseInt(st.nextToken());
num=new cam[n];
for(int i=0;i<n;i++) {
st = new StringTokenizer(br.readLine());
int k=Integer.parseInt(st.nextToken());
int d=Integer.parseInt(st.nextToken());
if(d==0) {
num[i]=new cam(0,k,0);
}
else {
num[i]=new cam(l-k,l,1);
}
}
int now=0;
go:while(now<n-1) {
while((num[now].x<=num[now+1].x&&num[now].y>=num[now+1].x)||(num[now].x<=num[now+1].y&&num[now].y>=num[now+1].y)
||(num[now].x>=num[now+1].x&&num[now].y<=num[now+1].y)) {
now++;
if(now==n-1) {
break go;
}
}
move(now);
result++;
}
System.out.println(result);
}
private static void move(int now) {
// TODO Auto-generated method stub
for(int i=now;i<n;i++) {
if(num[i].x==0&&num[i].y==l) {
continue;
}
if(num[i].d==0) {
num[i].x++;
num[i].y++;
if(num[i].y==l) {
num[i].d=1;
}
}
else {
num[i].x--;
num[i].y--;
if(num[i].x==0) {
num[i].d=0;
}
}
}
}
}
'알고리즘' 카테고리의 다른 글
백준 10800 <컬러볼> (0) | 2020.11.03 |
---|---|
SWEA 5656 <[모의 SW 역량테스트] 벽돌 깨기> (0) | 2020.11.02 |
SWEA 1824 <혁진이의 프로그램 검증> (1) | 2020.10.30 |
백준 1445 <일요일 아침의 데이트> (0) | 2020.10.29 |
백준 1238 <파티> (0) | 2020.10.28 |