티스토리 뷰
백준 20055번 : 컨테이어 벨트 위의 로봇
#include <stdio.h>
int rail[1002]; //레일의 내구도를 담을 배열
int robot[1002]; //로봇이 특정 레일에 있는지를 나타내기 위한 배열
int main(void)
{
int n, k; //레일 개수, 내구도 0 몇 개?
scanf("%d %d", &n, &k); //입력
for(int i = 1; i<=2*n; i++) scanf("%d", &rail[i]); //레일 내구도 입력받음
int in = 1; //레일 윗부분에서의 처음 시작지점
int out = n; //레일 윗부분에서의 처음 마지막지점
int broken = 0; //레일들의 내구도가 0이 될 때마다 1씩 늘어나는 변수
int loop = 0; //몇 단계인지를 알기위한 변수
while(broken < k) //step 4 //broken == k일 경우 whlie 벗어남
{
loop++; //step 1~4를 돌면 1씩 증가
if(in-1>0) in--; //step 1 레일의 시작지점과 마지막지점이 한칸 씩 이동
else in = 2*n; //시작지점에 -1을 했는데 0이 될 경우 2*n으로 대입
if(out-1>0) out--;
else out = 2*n; //마지막지점에 -1을 했는데 0이 될 경우 2*n으로 대입
if(robot[out] == 1) robot[out] = 0; //out spot 마지막지점에 로봇이 있다면 제거
for(int i = out-1; i > out-n; i--) //step 2 로봇들이 조건 성립시 한칸 씩 이동
{ //i = out-1인 이유 robot[out]은 step 1에서 1이더라도 반드시 0이 됨
//i < out-n인 이유 로봇들은 레일의 절반에서만 존재할 수 있음 (레일의 절반 : n)
//즉 마지막지점에서 1칸 전부터 시작지점 넘어까지의 로봇들이 움직일 수 있는지를 확인
int tmp_robot = i; //초기화 겸, 대입, 이동할 로봇의 위치
int tmp_rail = 0; //초기화, 이동한다면 로봇이 도달할 레일의 위치
if(i<1) tmp_robot = 2*n+i; //i가 1 미만이 되면 2*n을 더해줌
tmp_rail = tmp_robot+1; //1이 더 크다.
if(tmp_rail>2*n) tmp_rail = tmp_rail-2*n; //2*n초과 시 2*n을 빼줌
if((robot[tmp_robot] == 1 && rail[tmp_rail] != 0) && robot[tmp_rail] == 0)
{//로봇이 있고, 이동할 곳에는 로봇이 없고, 이동 할 곳의 레일의 내구도가 0이 아닐경우
robot[tmp_robot] = 0; //move_start //원래 있던 자리엔 더이상 로봇이 없고
robot[tmp_rail] = 1; //move_finish //한칸 옆에 로봇이 생김! (이동완료)
rail[tmp_rail]--; //-1 block // 레일의 내구도는 1 깎임
if(rail[tmp_rail] == 0) broken++; //broken block //rail의 내구도가 0이 될 경우
}
if(robot[out] == 1) robot[out] = 0; //out spot //로봇의 마지막지점에 도달했을 경우
}
if(rail[in]>0) //step 3 //시작지점에 로봇한개를 투입, 단 투입된 레일의 내구도는 1 줄어듬
{
robot[in]++; //투입!!
rail[in]--; //내구도 감소
if(rail[in] == 0) broken++; //rail의 내구도가 0 이 될 경우
}
}
printf("%d", loop); //결과 출력
return 0;
}
조건들
- 로봇은 레일 전체 길이 중 (연속적) 절반에만 위치 할 수 있다. 시작지점과 끝지점이 생긴다.
- 로봇은 끝(마지막)지점에 도달할 경우 레일을 떠난다.
- 로봇은 시작지점에서만 들어갈 수 있다.
- 레일의 내구도는 로봇이 투입될 때, 로봇이 이동해 올 때만 깎인다.
- 문제에서의 1단계부터 4단계
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 1003번 피보나치 함수 (백준) (0) | 2022.04.10 |
---|---|
c언어 2447번 별찍기 - 10 (백준) (0) | 2022.04.10 |
c언어 13458번 시험감독 (백준) (0) | 2022.04.09 |
c언어 14888 연산자 끼워넣기 (백준) (0) | 2022.04.07 |
c언어 고양이, 개 (백준) (부제 : c언어 \ 출력) (0) | 2022.03.01 |
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그리디
- 6198번
- C언어
- BFS
- Mo.s
- 최대공약수
- 그래프
- Krustal
- 16120번
- union
- 오프라인 쿼리
- 1835번
- 카드
- 백준
- 1835
- java
- 플로이드
- DFS
- find
- C++
- 6198
- DP
- 최소 스패닝 트리
- 정렬
- 누적 합
- 스택
- 세그먼트 트리
- 덱
- 누적합
- 트리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함