본문 바로가기
IT지식/개발

[구름레벨] 사은품 교환하기 PHP

by 7$ 2020. 8. 27.

문제 : 

시즌 한정 쿠폰(s_copns)과 일반 쿠폰(n_copns)으로 사은품을 교환할 수 있다.

총 12장의 쿠폰으로 교환할 수 있으며, 반드시 시즌 한정 쿠폰은 5장 이상이어야 한다.

 

알고리즘:

1. s_copnsn_copns을 사은품을 교환할 수 있는 최소값인 5와 7로 나눈 값을 비교.

2. s_copn <= n_copn 인 경우 s_copn을 출력

3. s_copn > n_copn 인 경우 n_copns을 모두 사용한 값을 출력

 

주의점 :

- s_copns n_copns은 64비트 부호정수형 범위

PHP_INT_MAX = 9223372036854775807

- while문을 사용하였더니 timeout이 되었음

- 7~10번은 테스트케이스를 통과하지 못하였다...ㅜ

 

<?php
	$n = fgets(STDIN); //입력 받을 테스트케이스 갯수
	if (intval($n) < 1 || intval($n) > 10000) { // 1이상 10,000이하
		return false;
	}
	$m = array(); //입력 받을 쿠폰 갯수를 배열로 받음
	for ($i = 0; $i < intval($n); $i++) { 
		$m[] = fgets(STDIN); //ex) 10 12
	}
	foreach ($m as $val) {
		$copn = explode(' ', trim($val)); //공백으로 구분
		$s_copns = intval($copn[0]); //시즌 쿠폰 갯수
		$n_copns = intval($copn[1]); //일반 쿠폰 갯수
		if ($s_copns < 5) { //시즌 쿠폰이 5개 이하면 사은품을 교환할 수 없다.
			printf("0\n");
			continue;
		}
		$t = 0;
		$s_copn = floor($s_copns / 5); //시즌 쿠폰을 5개씩 사용했을때 최대값
		$n_copn = floor($n_copns / 7); //일반 쿠폰을 7개씩 사용했을때 최대값
		
		if ($s_copn <= $n_copn)	 { 
			printf("%d\n",$s_copn); //시즌 쿠폰이 일반 쿠폰보다 적을 경우 최대값 출력
		} else { //시즌 쿠폰이 일반 쿠폰보다 많을 경우
				$s_copns -= $n_copn * 5; //일반 쿠폰 최대값으로 시즌 쿠폰을 사용
				$na = $n_copns % 7; //일반 쿠폰을 모두 사용하기 위해 나머지를 구함
				if ($na > 0) { 
					$n_copn++; 
					$t = 12 - $na; //일반 쿠폰 + 시즌 쿠폰 = 12
				}
				printf("%d\n",(floor(($s_copns-$t)/12))+$n_copn);
		}
	}
?>