나를 기록하다
article thumbnail
반응형

[백준 2839/자바(Java)] 설탕 배달

https://www.acmicpc.net/problem/2839

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net


시간 메모리 제한 제출 정답 맞힌 사람 정답 비율
1 초 128 MB 302839 112158 84392 36.699%

문제

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.

상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.

상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.

입력

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

출력

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

 

문제 풀이

문제를 이해만 한다면 로직이 복잡하지 않고 간단한 문제다. 처음에 로직을 어떻게 구성할 지 고민하는 데 시간이 꽤 소요되었던 문제였다.

문제 분석
  1. Nkg을 5kg 봉지와 3kg 봉지의 합으로 구성해야함.
  2. 봉지의 개수를 최소로 함 → 5kg 봉지를 최대한 많이 구성한다.
  3. N을 5로 나눈 몫을 q, 나머지를 r(N = 5 * q + r), 봉지의 최소 개수를 a라고 가정한다.
  4. r은 0, 1, 2, 3, 4 중에서 결정됨.
  5. r = 0 → a = q
  6. r = 1 → 5kg 봉지의 개수를 -1, 3kg 봉지의 개수를 +2 → a = q + 1
  7. r = 2 →5kg 봉지의 개수를 -2, 3kg 봉지의 개수를 +4 → a = q + 2
  8. r = 3 3kg 봉지의 개수를 +1 → a = q + 1
  9. r = 4 5kg 봉지의 개수를 -1, 3kg 봉지의 개수를 +3 → a = q + 2
  10. N이 4 또는 7인 경우 3과 5로 만들 수 없으므로 a = -1을 대입
  11. a를 출력한다.
 제출 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        // 입력을 받기 위한 BufferedReader 객체 생성
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 정수 n을 입력 받음
        int n = Integer.parseInt(br.readLine());
        br.close(); // BufferedReader 닫기

        // 5로 나눈 몫과 나머지 계산
        int quotient = n / 5;
        int remainder = n % 5;
        
        // 결과를 저장할 변수 초기화
        int answer = 0;

        // 나머지에 따라 다른 조건을 적용하여 결과 계산
        if (remainder == 0) {
            answer = quotient; // 나머지가 0인 경우, 몫 그대로 결과에 대입
        }
        if (remainder == 1 || remainder == 3) {
            answer = quotient + 1; // 나머지가 1 또는 3인 경우, 몫에 1을 더한 결과 대입
        }
        if (remainder == 2 || remainder == 4) {
            answer = quotient + 2; // 나머지가 2 또는 4인 경우, 몫에 2를 더한 결과 대입
        }

        // 4 또는 7일 때, 결과를 -1로 설정
        if (n == 4 || n == 7) {
            answer = -1;
        }

        // 결과 출력
        System.out.println(answer);
    }
}

우아한테크세미나 - 우아한 객체지향

매일 한 개의 테코톡이나 세미나와 같이 CS를 기반으로 하는 영상을 보고 정리하는 것을 목표로 하고 있는데 우아한 객체지향은 생각보다 내용이 방대하고 또한 강의 중간에 KSUG Seminar를 먼저 듣고 들으라는 발표자님의 말을 듣고 정리를 하다가 KSUG Seminar부터 다시 정리 중이다. 정리가 되는대로 업로드하겠다.

 

세미나의 대략적인 내용은 의존성, 설계 방식, 객체 참조 등에 관한 내용인데 중간에 코드가 많이 나와서 공부하는데 좋지만 정리하는 데 시간이 걸린다. 이런 유익한 세미나를 무료로 온라인으로 들을 수 있는 것에 감사함을 느낀다.


회고

어제 말했듯이 번아웃이 와서 며칠간 공부를 제대로 못한 것 같다. 집중도 오래가지 못하고, 몸도 뻐근하여 계속 불편하다.

그래서 추석 때, 공부를 놓지는 않지만 조금은 느슨하게 할 생각이다.

기존에 매일 10시간을 목표로 쉴틈없이 달려왔다면 추석 기간에는 하루 5시간 정도만 하면서 듣고 싶은 세미나를 듣고, 풀고 싶은 알고리즘 등을 풀면서 감을 잃지 않게끔 유지하며 다시 컨디션을 회복해보겠다.

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...