본문 바로가기

ALGORITHM

백준 1049 기타줄 (Java)

1. 문제 링크

 

1049번: 기타줄

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

www.acmicpc.net

 

2. 문제 및 입출력예제

 

3. 문제 풀이

기타줄의 패키지 가격은 배열에 저장하고, 낱개 가격은 제일 작은 가격만 저장한다.

최솟값은 각 패키지로 샀을 때의 가격마다 패키지로 사고 남은 만큼 낱개로 사는 가격으로 했다.

그렇게 구한 패키지를 샀을 경우의 최솟값과 낱개만으로 샀을 때의 가격을 비교해서 출력한다.

 

근데 다시 보니까 둘 다 최솟값만 구했으면 배열을 사용하지 않아도 되니까 더 좋을 것 같았다.

근데 유의미한 차이는 없더라...ㅎ

 

 

4. 코드

- 처음 푼 코드

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

public class Main {
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] nm = br.readLine().split(" ");
		int N = Integer.parseInt(nm[0]);
		int M = Integer.parseInt(nm[1]);
		int min = Integer.MAX_VALUE;
		int[] six= new int[M];
		int one = Integer.MAX_VALUE;
		int temp=0, num;
		for(int i=0;i<M;i++) {
			String[] split = br.readLine().split(" ");
			six[i] = Integer.parseInt(split[0]);
			one = Math.min(one, Integer.parseInt(split[1]));
		} 
		
		for(int i=0;i<M;i++) {
			num = N/6;
			temp = N/6*six[i];
			if(num*6 <N) {
				temp +=six[i];
				min = Math.min(temp, min);
				temp -=six[i];
				temp += N%6*one;
				min = Math.min(temp, min);
			}
			else {
				min = Math.min(temp, min);
			}
			
			temp = one*N;
			min = Math.min(temp, min);
		}
		System.out.println(min);
	}
}

 

- 둘 다 최솟값으로 푼 코드

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

public class Main {
	static StringBuilder sb = new StringBuilder();

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] nm = br.readLine().split(" ");
		int N = Integer.parseInt(nm[0]);
		int M = Integer.parseInt(nm[1]);
		int min = Integer.MAX_VALUE;
		int six = Integer.MAX_VALUE;
		int one = Integer.MAX_VALUE;
		
		int temp = 0, num;
		for (int i = 0; i < M; i++) {
			String[] split = br.readLine().split(" ");
			six = Math.min(six, Integer.parseInt(split[0]));
			one = Math.min(one, Integer.parseInt(split[1]));
		}
		num = N / 6;
		temp = N / 6 * six;
		if (num * 6 < N) {
			temp += six;
			min = Math.min(temp, min);

			temp -= six;
			temp += N % 6 * one;
			min = Math.min(temp, min);
		} else {
			min = Math.min(temp, min);
		}
		temp = one * N;
		min = Math.min(temp, min);
		System.out.println(min);
	}
}

'ALGORITHM' 카테고리의 다른 글

백준 1541 잃어버린 괄호 (Java)  (0) 2023.03.18
백준 1987 알파벳 (Java)  (0) 2023.03.17
백준 17135 캐슬 디펜스 (Java)  (0) 2023.03.16
백준 1697 숨바꼭질 (Java)  (0) 2023.03.16
백준 2577 숫자의 개수 (Java)  (0) 2023.03.15