본문으로 바로가기

[ 문제 ]

커피를 좋아하는 성태는 집 주변에 있는 구름커피(Goorm Coffee)의 단골 손님이다.

출근길뿐만 아니라 식사 후 그리고 업무상 미팅도 구름커피를 애용하는 성태는 본인도 모르는 사이 수 많은 쿠폰을 적립해두고 있었다.

 

최근 구름커피에서는 고객이 모은 쿠폰을 상품으로 교환해주는 이벤트를 진행하고 있었고,

이를 알게 된 성태는 자신은 몇 개의 상품을 얻을 수 있을지 궁금해졌다.

하지만 너무나 많은 쿠폰을 보유하고 있는 성태는 자신이 얻을 수 있는 최대의 상품 수를 계산하기가 어려웠다.

성태의 쿠폰으로 얻을 수 있는 상품의 수를 계산해주는 프로그램을 작성해주자.

 

현재 성태는 N개의 시즌 한정 음료 쿠폰과 M개의 일반 음료 쿠폰을 가지고 있다.

그리고 구름커피에서는 다음과 같은 조합으로 12장의 쿠폰을 제시하면 이를 상품으로 교환해주고 있다.

  • 하나의 상품으로 교환하기 위해서는 12장의 쿠폰이 필요하다.
  • 이 쿠폰들 중 최소 5개는 시즌 한정 음료 쿠폰이어야 한다.

예를 들어서 시즌 한정 음료 쿠폰 6개와 일반 음료 쿠폰 6개를 제시하면 상품으로 교환할 수 있지만,

시즌 한정 음료 쿠폰 4개와 일반 음료 쿠폰 8개를 제시하면 상품으로 교환할 수 없다.

 

[ 입력 형식 ]

  • 첫 줄에는 테스트케이스의 수를 나타내는 1이상 10,000이하의 자연수 T가 입력으로 주어진다.
  • 이후 총 T개의 테스트케이스에 대한 입력이 차례로 주어진다.
  • 각 테스트케이스에 대한 입력은 한 줄에 주어진다.
  • 두 개의 정수 N, M이 공백으로 구분되어 차례로 주어진다.
    • N은 성태가 보유한 시즌 한정 음료 쿠폰의 수를 나타낸다.
    • M은 성태가 보유한 일반 음료 쿠폰의 수를 나타낸다.
    • N과 M은 모두 64비트 부호형 정수형 범위 내에 존재하는 0 이상의 정수다.

 

[ 출력 형식 ]

  • 각 테스트케이스에 대한 정답을 순서대로 한 줄씩 출력한다.
  • 성태가 보유한 쿠폰으로 교환할 수 있는 최대 상품의 수를 계산하여 출력하시오.

 


[ 풀이 ]

N을 최소로 사용할 수 있는 경우는 N을 5장, M을 7장 사용하는 경우이기 때문에

먼저, 이런 경우로 만들 수 있는 상품 수를 cnt에 더해주었습니다.

 

그리고 cnt 수만큼 빼주어 N과 M의 값을 갱신해주었습니다.

 

N이 5장 이상 있어야 하는게 조건이므로

N이 5장 이상이고 M+N이 12장 이상있어서 상품을 받을 수 있는 경우 (①)

M을 전부 사용해주고 나머지를 N으로 사용하여 1개의 상품을 받을 수 있습니다.

 

제가 헷갈린게 조건으로 N이 5장 이상 있는 경우만 고려하면 된다고 생각했는데 M+N<12인 경우가 있기 때문에

꼭 조건 두 개를 써줘야 하더라구요.

예를 들어 N이 8장 있고, M이 3장 있는 경우는 N>=5는 만족하지만 M+N>=12를 만족하지 못해서 상품을 받을 수 없습니다.

 

이제 M은 0장이므로 N으로 12장을 전부 사용하는 경우의 수를 더해주었습니다. (②)

 

마지막으로, cnt의 데이터 타입도 꼭 long으로 선언해줘야 정답이 됩니다.

int로 선언해줬더니 틀리더라구요..

 

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

class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		
		int T = Integer.parseInt(br.readLine());
		for(int t = 0; t < T; t++) {
			st = new StringTokenizer(br.readLine());
			
			long N = Long.parseLong(st.nextToken()); // 성태가 보유한 시즌 한정 음료 쿠폰 수
			long M = Long.parseLong(st.nextToken()); // 성태가 보유한 일반 음료 쿠폰 수
			long cnt = 0;
			
			cnt += Math.min(N/5, M/7);
			N -= 5*cnt;
			M -= 7*cnt;
			
			if (N >= 5 && M+N >= 12) { // ①
				N -= (12-M);
				M = 0;
				cnt++;
			}
				
			cnt += N / 12; // ②
			
			System.out.println(cnt);
		}
	}
}