백준 알고리즘(코딩테스트 공부)

전국 대학생 프로그래밍 대회 동아리 연합

Dev.gunnuuu 2024. 9. 19. 10:10

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

문제

백준이는 작년 전국 대학생 프로그래밍 대회 동아리 연합(이하 전대프연) 회의에 불참했기 때문에, 올해 회장으로 선출되었다.

전대프연 회장은 오프라인 대회를 가을에 1회 개최해야 한다. 백준이는 대회를 개최할 주말을 마음대로 고를 수 있고, 회원들이 머무를 호텔을 찾아야 한다. 전대프연의 자금 사정은 넉넉하지 않기 때문에, 되도록 싼 호텔을 찾아야 한다.

여행의 총 비용은 예산을 초과하면 안 된다. 모든 회원은 같은 호텔에서 머물러야 한다. 작년에 모든 회원이 같은 호텔에 머무르지 않았고, 이로인해 대재앙이 일어났다. 일부 회원은 길을 잃어버렸고, 아직까지 그들을 다시 본 사람은 없다. 

입력

첫째 줄에 참가자의 수 1 ≤ N ≤ 200, 예산 1 ≤ B ≤ 500000, 호텔의 수 1 ≤ H ≤ 18, 고를 수 있는 주의 개수 1 ≤ W ≤ 13이 주어진다. 다음 줄부터 각 호텔의 정보가 주어지며, 호텔의 정보는 두 줄로 이루어져 있다. 첫 번째 줄에는 그 호텔의 일인당 숙박비용 1 ≤ p ≤ 10000이 주어지고, 둘째 줄에는 i번째 주에 투숙 가능한 인원 0 ≤ a ≤ 1000이 주어진다.

출력

첫째 줄에 대회를 개최할 수 있으면 최소 비용을 출력하고, 없으면 "stay home"을 출력한다.

예제 입력 1 

3 1000 2 3
200
0 2 2
300
27 3 20

예제 출력 1 

900

예제 입력 2 

5 2000 2 4
300
4 3 0 4
450
7 8 0 13

예제 출력 2 

stay home

 

풀이

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {   
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String text = br.readLine();
        String strArr[] = text.split(" ");
        int arr[] = new int[strArr.length];
        for(int i = 0; i < strArr.length; i++) {
            arr[i] = Integer.parseInt(strArr[i]);
        }
        int N = arr[0];
        int B = arr[1];
        int H = arr[2];
        int W = arr[3];
        
        List<Integer> prices = new ArrayList<>();

        for (int i = 0; i < H; i++) {
            int price = Integer.parseInt(br.readLine());  
            String[] availability = br.readLine().split(" ");  

            for (String s : availability) {
                int availableBeds = Integer.parseInt(s);
                if (availableBeds >= N && price * N <= B) {
                    prices.add(price * N);
                    break;
                }
            }
        }
        
        if(prices.isEmpty()){
            System.out.print("stay home");
        }else{
            Collections.sort(prices);
            System.out.println(prices.get(0));
        }
    }
}

 

입력으로 읽어와야할 문자열이 공백을 포함한 문장이므로 BufferedReader를 사용하여 공백을 포함하는 line별로 읽어와서 처리하여야 겠다고 생각하였다. readLine()으로 읽어온 text를 spilt(" ") 메소드를 사용하여 공백을 구분자로 하여 strArr 배열에 각 원소로 저장해준 뒤 나중 int 형식의 숫자로 크기를 비교하여 판별해야 하므로 int형 배열로 parseInt하여 저장해주고 각 원소들을 변수에 저장하였다. 그 뒤 위에서 변수로 저장한 H 즉, 호텔의 수만큼 for문을 돌려 첫 줄을 읽어와 int형으로 변환하여 price로,  두 번째 줄을 읽어와 split으로 공백으로 나누어 availablity 배열의 원소들로 초기화해 주었다. 이제 for-each문으로 가져온 투숙 가능한 인원 정보들을 N과 비교하여 참가자의 수가 다 투숙 가능한지, price *N과 B를 비교하여 예산을 넘지는 않는지 if 문을 사용하여 반별한 뒤 이를 만족할 경우에는 미리 생성해준 ArrayList인 prices에 필요한 총 금액을 나타내는 price * N 값을 저장해주었다. 마직막으로 이렇게 초기화된 prices 를 확인하여 만족하는 경우가 없어 비어있다면 만족하는 호텔이 없으므로 "stay home" 을 출력하고 반대로 만족하는 경우가 있다면 최소 비용을 찾아 출력하기 위해 Collections.sort() 메소드를 사용하여 내림차순으로 정렬 한 뒤,  prices.get(0) 을 가져와 출력해 주어 구현할 수 있었다.

'백준 알고리즘(코딩테스트 공부)' 카테고리의 다른 글

온라인 판매  (0) 2024.09.19
반지  (0) 2024.09.19
그룹 단어 체커  (0) 2024.09.18
카드1  (1) 2024.09.18
소트인사이드  (0) 2024.09.18