[백준] 20055 - 컨베이어 벨트 위의 로봇 (JAVA)

개츠비·2023년 4월 5일
0

백준

목록 보기
54/84
  1. 소요시간 : 1시간 30분 정도 ? 정확하게 재진 않음
  2. 문제 사이트 : 백준
  3. 문제 수준 : 골드 5
  4. 문제 유형 : 구현, 시뮬레이션
  5. 다른 사람의 풀이를 참고 했는가 ? : X
  6. 한 번 풀었다가 다시 푸는 문제인가 ? : X
  7. 문제 링크 : https://www.acmicpc.net/problem/20055
  8. 푼 날짜 : 2023.04.06

1. 사용한 자료구조 & 알고리즘

구현 !

2. 사고과정

일단 문제가 뭔 소리인지 도대체가 이해가 안 돼서 문제 해설을 봤다.

처음에 문제 해석을 어느정도 하긴 했는데 이상하게 해석하기도 했다.

문제를 완전히 이해한 후에는 30분 안에 푼 것 같다.
다른 사람들도 문제를 이해 못한 사람들도 꽤 있는 걸 보면
음....

3. 풀이과정

  1. Container 클래스를 만든다. 현재 컨테이너의 라이프,
    그리고 로봇이 있는지 없는지 여부를 확인하는 용도.
  2. 반복문의 횟수가 정해진 것이 아닌, 종료의 조건이 정해진 것이기 때문에 while 문 사용.
  3. 모든 컨테이너 위치를 한칸씩 옮긴다. 이 때, 컨테이너를 복사한 배열을 만들어서 옮긴다.
  4. N 번쨰 위치의 로봇을 없앤다. (내리는 위치 이므로 )
  5. 가장 먼저 벨트에 올라간 로봇부터 탐색해서, 로봇의 위치를 옮겨주는데
    🧐 이 때 어떻게 가장 먼저 올라간 로봇의 위치를 아는가 ?
    그냥 무조건 N번째부터 N-1, N-2 ... 번째의 순서대로 탐색하면 된다.
    (1) 현재 칸의 라이프가 1 이상이고
    (2) 현재 칸에 로봇이 없고
    (3) 전의 칸에 로봇이 있다면
    로봇을 옮겨준다. 이 때 life가 줄었을 때 0이 된다면 K를 1 줄여준다.
  6. 이제 첫 번째 컨테이너를 보고, 첫 번째 컨테이너의 라이프가 1 이상이면, 라이프를 1 줄이고 로봇을 올린다. 이때도 마찬가지로 라이프가 0이 된다면 K를 1 줄여준다.

4. 소스코드

import java.util.*;
import java.io.*;

public class Main{


	public static void main(String[] args) throws IOException{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb=new StringBuilder();
		StringTokenizer st;

		st=new StringTokenizer(br.readLine());
		int N=Integer.parseInt(st.nextToken());
		int K=Integer.parseInt(st.nextToken());
		Container container[]=new Container[N*2+1];
		st=new StringTokenizer(br.readLine());
		for(int i=1;i<=2*N;i++) {
			int num=Integer.parseInt(st.nextToken());
			container[i]=new Container(num,false);
		}

		int count=0;
		while(K>0) {
			Container copy[]=container.clone();
			int idx=2;
			for(int i=1;i<container.length;i++) {
				if(idx>=container.length) idx=1;
				container[idx++]=copy[i];
			}
			
			container[N].robot=false; //N 번째의 로봇은 없어진다.


			for(int i=N;i>1;i--) {
				//현재칸에 라이프가 1 이상이고 로봇이 없고,
				//내 이전 칸에 로봇이 있다면
				if(container[i].life>=1&&!container[i].robot&&container[i-1].robot) {
					if(i!=N) //현재 칸이 N번쨰 칸이면 내리는 위치이므로 제외
						container[i].robot=true;
					container[i].life--;
					container[i-1].robot=false; //전의 칸 로봇 없애줌
					
					if(container[i].life==0) K--; //라이프가 0되면 K 하나 줄음
				}
			}
			
            //첫 번째 컨테이너 위치의 라이프가 1 이상이면 라이프 1 줄이고 로봇을 올림
			if(container[1].life>=1) {
				container[1].life--;
				container[1].robot=true;
				if(container[1].life==0) K--;
			}

			count++;

		}
		System.out.println(count);



	}
}
class Container {
	int life;
	boolean robot;
	Container (int life,boolean robot){
		this.life=life;
		this.robot=robot;
	}
}

5. 결과

6. 회고

프로그래밍 실력보다 문제 해석 실력을 늘려야하는 걸까
문제가 이해가 안 된다 ㅠ_ㅠ

하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212

profile
아이스 카라멜 마끼아또보단 뜨거운 아메리카노를, 맨투맨보단 니트를, 웹툰보단 책을 좋아하고 싶은 사람

0개의 댓글