티스토리 뷰

알고리즘

2839번 설탕배달

wlsdl00 2024. 1. 2. 10:20

문제


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

코드


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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        //N입력
        int N = Integer.parseInt(bf.readLine());

        if (N == 3) {
            System.out.println(1);
            return;
        }

        if (N == 4 || N == 7) {
            System.out.println(-1);
            return;
        }

        int five = 0;
        int remain = 0;

        int three;
        if (N >= 5) {
            five = N / 5;
            remain = N % 5;
        }
        //point1
        while (remain % 3 != 0) {
            five--;
            remain += 5;

            //point2
            if (remain > N) {
                System.out.println(-1);
                return;
            }
        }

        three = remain / 3;

        System.out.println(five + three);
    }
}

풀이 방법


  • five, three : 5kg의 설탕 주머니, 3kg의 설탕 주머니의 개수
  • remain : N을 5로 나눈 나머지
💡
예를 들어 N이 11이라면?
  1. 최초에 11을 5로 나눠서 five = 2 , 그에 대한 remain = 1 로 결정된다.
  1. remain 에 대해 3으로 나눈 몫을 구하려고 하지만, 1은 3으로 나눴을 때 0이 되지 않는다.
  1. 따라서 최초에 five=2 로 잡았던 결정을 뒤로 돌려 five = 1 , 그리고 그에 따라 remain = 6 인 경우에 대해서 확인한다.
  1. 6에 대해서는 3으로 나누어 떨어지기 때문에 조건을 만족한다.
  1. 따라서 결과는 five = 1, three = 2 로 결정된다.

핵심 포인트


  1. 만약 3kg과 5kg으로 N이 이루어지지 못한다면 -1로 출력하는 것은 어떻게?
    • 위 코드의 point1 과정에서 만약 4, 7과 같은 조건을 만족하지 못하는 N이 입력으로 들어오는 경우, remainN 보다 커지는 경우 발생했음.
    • 따라서 remainN 보다 커진다면, -1 을 출력하도록 구현
  1. 반례 처리
    • 4, 7에 대해 하드코딩으로 반례를 처리함.
    • 마찬가지로 3에 대해서도 하드코딩으로 반례를 처리함 → 미처리시 3을 입력했을 때 0이 출력됨. 이 부분에 대한 반례를 찾지 못해 시간을 쏟았다가 찾은 후에 하드코딩으로 처리

보완할 점 / 느낀 점


  • 반례찾는 연습
  • 수학적 접근에 대한 학습
    → 현재는 11과 같은 숫자를 처리하기 위해 whlie문을 사용하였으나, 아래와 같이 O(1)로 만들 수도 있다.

참고 자료


https://st-lab.tistory.com/72

'알고리즘' 카테고리의 다른 글

2217번 로프  (1) 2024.01.03
1931번 회의실 배정  (0) 2024.01.02
2012번 등수 매기기  (0) 2024.01.02
11399번 ATM  (1) 2024.01.02
7568번 덩치  (0) 2024.01.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함