Baekjoon algorithm training

[백준] 2839 (설탕 배달)

interfacer_han 2023. 12. 4. 12:21

#1 알고리즘

0 ~ (N / 3)을 순회한다는 점에서 a는 음수일 수 없다. 하지만, b는 명시적으로 순회하는 게 아니라, a의 범위를 순회할 때 간접적으로 도출된다. 이 때, b가 혹여나 음수 값으로 계산되지 않을까 하는 우려가 있을 수 있다. 우려를 해소해보자면, a의 최댓값은 N / 3이다. 따라서 항상 (N - 3 * a) / 5 >= 0 이 성립한다. b = (N - 3 * a) / 5 이므로, b값은 음수일 수 없다.
 

#2 코드

#2-1 자바

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.nextLine();
        sc.close();
        
        int lowestBags = -1;
        
        // 3*a + 5*b = N을 만족하는 a와 b값 찾기 시작
        
        // a의 범위: 0 ~ N/3
        int maxA = N / 3;
    
        // a의 범위 순회하며, b값이 정수가 나오는 경우 밝혀내기
        for(int a = 0; a <= maxA; a++) {
            if((N - 3*a) % 5 == 0) {
                int b = (N - 3*a) / 5;
            
                // a + b 값이 현재까지의 나온 최솟값인지 확인 및 갱신
                if(lowestBags == -1) {
                    lowestBags = a + b;
                    
                } else {
                    if(a + b < lowestBags) {
                        lowestBags = a + b;
                    }
                }
            }     
        }
        
        System.out.println(Integer.toString(lowestBags));
    }
}

 

#2-2 코틀린

fun main() {
    val N = readln()!!.trim().toInt()
    
    var lowestBags = -1
    
    // 3*a + 5*b = N을 만족하는 a와 b값 찾기 시작
    
    // a의 범위: 0 ~ N/3
    val maxA = N / 3
    
    // a의 범위 순회하며, b값이 정수가 나오는 경우 밝혀내기
    for(a : Int in 0..maxA) {
        if((N - 3*a) % 5 == 0) {
            val b = (N - 3*a) / 5
            
            // a + b 값이 현재까지의 나온 최솟값인지 확인 및 갱신
            if(lowestBags == -1) {
                lowestBags = a + b
                
            } else {
                if(a + b < lowestBags) {
                    lowestBags = a + b
                }
            }
        }
    }
    
    println("${lowestBags}")
}