본문 바로가기
프로그래밍/백준 문제 풀이(자바)

백준 2839번 자바 문제 답/해설(설탕 배달 문제)

by 리드민 2021. 12. 19.
반응형

[1] 백준 카테고리
단계별로 풀어보기
기본 수학 1
7단계 2839번 문제
설탕 배달 문제


[2] 문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.
상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.
상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.


1. 입력
첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)


2. 출력

상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.


3. 예제 입력 1
18


4.예제 출력 1

4

 

5. 예제 입력 2

4

 

6. 예제 출력 2

-1


[3] 정답

1. 정답 해설 미포함

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException{
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		int N = Integer.parseInt(st.nextToken());
		int bag = 0;
		
		while(true) {
			if(N%5==0) {
				bag += N/5;
				System.out.println(bag);
				break;
			}
			else {
				N-=3;
				bag++;
			}
			if(N<0) {
				System.out.println("-1");
				break;
			}
		}
		
	}
}


2. 정답 해설 포함

import java.io.BufferedReader;
/* BufferedReader 사용을 위해서 java.io.BufferedReader 클래스를 import 한다
Enter를 경계로 인식하고 받은 데이터는 String으로 고정된다.*/
import java.io.InputStreamReader;
/* byte 단위 데이터를 문자 단위 데이터로 처리할 수 있도록 변환해주기 위해서 
InputStreamReader를 사용한다.
InputStreamReader 사용을 위해서 java.io.InputStreamRead 클래스를 import 한다. */
import java.io.IOException;
/* 예외처리를 위해서 IOException를 사용한다
IOException 사용을 위해서 java.io.IOException 클래스를 import 한다*/
import java.util.StringTokenizer;
/* 공백 단위로 호출하기 위해서 StringTokenizer를 사용한다
StringTokenizer를 사용하기 위해서
StringTokenizer java.util.StringTokenizer 클래스를 import 한다. */

public class Main {
// 접근제어자 public으로 Main 클래스를 선언한다
	public static void main(String[] args) throws NumberFormatException, IOException{
	// 접근제어자 public으로 메모리에 상주하게 리턴값이 없이 main 함수를 선언한다	
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// BufferReader 객체 br를 선언한다
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		// StringTokenizer 객체 st를 선언한다 이제 공백으로 값을 입력받을 수 있다.
		
		int N = Integer.parseInt(st.nextToken());
		// int 형 변수 N를 선언하고 값을 공백 단위로 구분해서 입력받는다.
		int bag = 0;
		// int 형 변수 bag를 선언하고 0으로 초기화한다
		
		while(true) {
		// while 반복문을 선언한다.
			if(N%5==0) {
			// N%5가 0일때 코드가 실행된다.
				bag += N/5;
				// N/5 값을 bag에 저장한다.
				System.out.println(bag);
				// bag 값을 출력한다
				break;
				// while 문을 빠져나온다
			}
			else {
				N-=3;
				// N-3한 값을 변수 N에 저장한다.
				bag++;
				// bag+1한 값을 변수 bag에 저장한다.
			}
			if(N<0) {
			// N<0 일때 괄호안의 코드가 실행된다.
				System.out.println("-1");
				// -1이 출력된다
				break;
				// while 문을 빠져온다.
			}
		}
		
	}
}

 

연산 부분

		while(true) {
			if(N%5==0) {
				bag += N/5;
				System.out.println(bag);
				break;
			}
			else {
				N-=3;
				bag++;
			}
			if(N<0) {
				System.out.println("-1");
				break;
			}
		}

5로 나누어지면 봉투개수가 바로 출력된다.

5로 나누어졌는데 나머지가 있다면 N-3이 반복되고 N-3한 값이 5로 나누어진다면 다시 if문으로 돌아가 5로 나눈 값을 더하여 변수 bag에 저장된 값이 출력된다.

3을 뺐는데 음수가 나온다면 -1이 출력된다.

반응형