문제 풀이 및 개발 공간

[백준] 1817번 짐 챙기는 숌 문제! (silver 5 본문

백준공부/java

[백준] 1817번 짐 챙기는 숌 문제! (silver 5

gomduri43 2022. 7. 24. 21:33

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {

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

		int n=Integer.parseInt(st.nextToken());
		int weightOfBox=Integer.parseInt(st.nextToken());
		int[] num=new int[n];
		int total=0;  //총 필요한 박스의 개수 
		int box=0;    //박스에 책을 담을 때 그 박스의 무게 
		if(n==0) {
			System.out.println(total);   //n이 0이면 0개의 박스를 출력. 
		}
		else {
			st=new StringTokenizer(br.readLine());
			for(int i=0; i<n; i++) {
				num[i]=Integer.parseInt(st.nextToken());
			}
			//박스에 먼저 책을 담고, a책을 넣었을때 무게가 박스 수용 무게보다 커지면, 
            //박스수++ 를 하고, 새로운 박스에 a책을 넣는다. 
            //박스 수용 무게와 들어있는 책의 무게가 같으면 박스수++, 박스무게는 0으로 초기화
			//이때 중요하게 짚고 넘어가야 할 것은 ,중간과정에서 박스무게를 초과하든, 
            //박스 무게와 똑같든은 문제가 되지 않는다. 하지만, 마지막 책을 담을때, 
            //조금 예외가 발생한다. 
            //만약 마지막에 책a 를 박스에 넣을때 무게가 초과할 경우,
            //코드에서는 박스수+1을 하고, 새박스에 a를 넣게 되어있다.
            //이게 중간에서는 새박스에 a를 넣고서 이 박스가 박스 수용무게를 초과하든
            //같든 간에, 새박스를 만들면서 카운트가 되지만, i==n-1일때, 즉 마지막에는
            //카운트가 되지않는다. 
            //즉 마지막 책을 넣음으로써 박스 무게가 초과하게 되면, 이미 들어있는 박스수를
            //세는 것이지, a를 담을 새로운 박스는 카운트가 되지 않는 것이다. 그렇기에
            //마지막에 박스무게를 초과할 경우 +1을 한다.
            //박스무게와 같게 끝날경우는 문제 ㄴㄴ
            //마지막으로, 박스 무게를 초과하지도, 같지도 않은, 마지막 박스가 여유가 남게
            //남은 경우를 세어야 하므로, else 문을 통해, 어디에도 해당되지 않는 이 경우를
            //마지막에 더해준다. 이또한 중간과정에서는 결국 박스가 초과, 혹은 같게되면서
            //카운트가 되기에 문제가 되지않지만, 마지막은 더 담지 않아 조금 다른 경우인 것이다. 
            for(int i=0; i<n; i++) {
				box+=num[i];
				if(box>weightOfBox) {
					total+=1; //박스 수용무게 초과로 박스수 ++ 
					box=num[i];  //새로운 박스에 넣기
					if(i==n-1) {
						total++;
					}
				}
				else if(box==weightOfBox) {
					total++;
					box=0;
				}
				else {
					if(i==n-1) {
						total++;
					}
				}
			}
			System.out.println(total);
		}
	}
}
//이 문제를 처음 제출할 당시 런타임 에러가 떴다. 그 이유는 다름아닌, n==0인 경우,
//처음에 n==0인 경우를 if else로 나누지 않아서, n==0일 경우에 null값이 입력되어, 
//null) 런타임에러가 발생했다. 제시문에서 n==0일 경우는 책 무게 입력없이 박스 수를 
//출력한다고 했으므로, 조건을 걸어서 예외시킨다.
import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[]args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st=new StringTokenizer(br.readLine());

        int n=Integer.valueOf(st.nextToken());
        int b=Integer.valueOf(st.nextToken());

        int answer=0;
        int in=0;
        if(n!=0) {
            st = new StringTokenizer(br.readLine());
        }
        for(int i=0; i<n; i++){
            int temp=Integer.valueOf(st.nextToken());
            if(in+temp<=b){
                in+=temp;
            }
            else{
                in=temp;
                answer++;
            }
        }
        answer= n!=0 ? answer+1 :answer;
        bw.write(answer+"");
        bw.flush();

    }
}



//24년 2월 27일 코드 뭔가 간결해짐