[백준 1049 / Silver4] 기타줄 - Java(자바)

토끼굴·2025년 4월 20일
post-thumbnail

작성자 : 고유진
문제 링크 : https://www.acmicpc.net/problem/1049

❓문제 설명


Day Of Mourning의 기타리스트 강토가 사용하는 기타에서 N개의 줄이 끊어졌다. 따라서 새로운 줄을 사거나 교체해야 한다. 강토는 되도록이면 돈을 적게 쓰려고 한다. 6줄 패키지를 살 수도 있고, 1개 또는 그 이상의 줄을 낱개로 살 수도 있다.
끊어진 기타줄의 개수 N과 기타줄 브랜드 M개가 주어지고, 각각의 브랜드에서 파는 기타줄 6개가 들어있는 패키지의 가격, 낱개로 살 때의 가격이 주어질 때, 적어도 N개를 사기 위해 필요한 돈의 수를 최소로 하는 프로그램을 작성하시오.


❗입력 및 출력


[ 입력 ]
첫째 줄에 N과 M이 주어진다. N은 100보다 작거나 같은 자연수이고, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 각 브랜드의 패키지 가격과 낱개의 가격이 공백으로 구분하여 주어진다. 가격은 0보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

[ 출력 ]
첫째 줄에 기타줄을 적어도 N개 사기 위해 필요한 돈의 최솟값을 출력한다.


🎁 문제 풀이


되도록 돈을 적게 써야 함
1. M개의 브랜드 중 낱개 가격이 최소일 때 끊어진 기타줄 N개 사는 경우
2. 패키지에는 기본적으로 6개의 기타줄이 들어있음 -> 끊어진 기타줄 N개에서 6으로 나눠줘서 남는 경우
2-1 . 남았을 때 패키지 구매가 더 싼 경우
2-2 . 남았을 때 낱개가 더 싼 경우
이렇게 1, 2-1, 2-2를 비교해서 최소 금액을 구하도록 코드 작성
처음에는 변수명을 패키지를 package라고 두었더니 계속 컴파일 에러가 발생했는 데 Java 기본 문법 개념을 잊고 있었던 것.. 변수명 사용에 대한 규칙
처음 코드는 입력받은 패키지와 낱개 금액에 대해 각각 최솟값 순으로 정렬 -> Array.sort 사용해도 되었을 듯..
찾아보니 아예 처음부터 남는 개수로 if else문을 통해 마지막에 최소 금액을 찾는 코드도 있었는 데 속도 차이나 메모리 차이는 크게 X

🖥️ 코드


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 IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken()); 
        int M = Integer.parseInt(st.nextToken()); 
        int minPack = Integer.MAX_VALUE;
        int minUnit = Integer.MAX_VALUE;

        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            int pack = Integer.parseInt(st.nextToken());
            int unit = Integer.parseInt(st.nextToken());

            minPack = Math.min(minPack, pack);
            minUnit = Math.min(minUnit, unit);
        }

        int result = Math.min(((N / 6) + 1) * minPack, N * minUnit); 
        result = Math.min(result, (N / 6) * minPack + (N % 6) * minUnit); 
        System.out.println(result);
    }
}

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 M = Integer.parseInt(st.nextToken());
		int pack = 1000;
		int single = 1000;
		
		for(int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			pack = Math.min(pack, Integer.parseInt(st.nextToken()));
			single = Math.min(single, Integer.parseInt(st.nextToken()));
		}
		
		int A, B, C;
		
		if(N % 6 == 0) {
			A = pack * (N / 6);
		}else {
			A = pack * ((N / 6) + 1);
		}
		B = (pack * (N / 6)) + (single * (N % 6));
		C = single * N;
		
		int result = Math.min(A, Math.min(B, C));
		
		System.out.println(result);
	}

}
profile
10마리의 토끼가 열심히 공부 중.. 집단 지성으로 성장해요.

0개의 댓글