[알고리즘]JAVA - 사은품 교환하기
- 카테고리 없음
- 2020. 8. 28.
사은품 교환하기.
의외로 애먹은 문제이다.
사람의 수를 입력 받고, 쿠폰 A와 B의 갯수를 받고 교환 할 수 있는 커피의 개수를 구하는 문제였다.
이 문제의 포인트는
A의 갯수는 최소 5개 이상이여야 하며.
A+B의 갯수는 12개 이상이여야 한다는 것이다.
두개의 조건은 항상 TRUE이여야 한다.
그래서 아래와 같이 짤막한 코딩이 만들어졌다.
public class Pro02_02
{
public static void main(String[] args) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
// 배열 크기
int size = Integer.parseInt(input);
// 배열 받기
String[] arrS = new String[size];
for(int i=0; i<size; i++)
{
// 커피 받기
arrS[i] = br.readLine();
}
for (int i = 0; i < size; i++)
{
String[] arr = arrS[i].split(" ");
// 값 1 , 값 2 만들기 N과 K의 값
// 한정 음료의 갯수
long num1 = Long.parseLong(arr[0]);
// num2 : 쿠폰의 갯수, total : 전체 갯수, 반환 할 수 있는 갯수, minus : 일반쿠폰 부족한 갯수
long num2 = 0;
int total = 0, cnt = 0, minus;
num2 = Long.parseLong(arr[1]);
while (num2 > 6 && num1 > 4)
{
num1 -= 5;
num2 -= 7;
cnt++;
}
if(num2 < 12)
{
num1 += num2;
cnt +=num1/12;
}
// 커피 받기 종료
System.out.println(cnt);
}
}
}
위의 조건에 맞게 while문과 if문을 배치하여 만들었다.
그러나 생각지도 못 한 문제가 발생했다.
문제의 내용은 64bit의 정수를 입력 받는다는 것이고
이는 10억 이상의 수를 10만개 입력 받을 수 있다는 가정이었다.
이럴 경우, 작업시간은 오래걸리며 제한시간 4초를 넘기는 슬픈 경우가 발생한다.
그래서 4시간 동안 고민 끝에 만들어진 짤막한 코드는 아래와 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Pro02_04
{
public static void main(String[] args) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
// 배열 크기
int size = Integer.parseInt(input);
// 배열 받기
String[] arrS = new String[size];
for(int i=0; i<size; i++)
{
// 커피 받기
arrS[i] = br.readLine();
}
for (int i = 0; i < size; i++)
{
long num1 = 0, num2 = 0;
long result=0, result1= 0, result2=0;
String[] arr = arrS[i].split(" ");
// 값 1 , 값 2 만들기 N과 K의 값
// 한정 음료의 갯수
num1 = Long.parseLong(arr[0]);
// num2 : 쿠폰의 갯수
num2 = Long.parseLong(arr[1]);
result1 = num1/5;
result2 = (num1+num2)/12;
result = (result1 <= result2)? result1 : result2;
System.out.println(result);
}
}
}
사람 수 입력받는 문장을 제외하고는 반복문을 모두 없앴다.
또한 재밋는 규칙이 있었는데, 입력받은 A 값 /5 의 결과와 입력받은 A+B 값 / 12의 최소값이 정답이라는 것이다.
그래서 삼항연산자를 통해 간단히 해결되었다.
반응형