[알고리즘]JAVA - 사은품 교환하기

    https://brandi.goorm.io/exam/84506/%EB%AA%A8%EC%9D%98%ED%85%8C%EC%8A%A4%ED%8A%B8-2020-%EB%B8%8C%EB%9E%9C%EB%94%94-%EC%BD%94%EB%94%A9%EB%8C%80%ED%9A%8C-%EC%BD%94%EB%93%9C%EB%84%A4%EC%9E%84b-%EB%AA%A8%EC%9D%98%ED%85%8C%EC%8A%A4%ED%8A%B8/quiz/2
    https://brandi.goorm.io/exam/84506/%EB%AA%A8%EC%9D%98%ED%85%8C%EC%8A%A4%ED%8A%B8-2020-%EB%B8%8C%EB%9E%9C%EB%94%94-%EC%BD%94%EB%94%A9%EB%8C%80%ED%9A%8C-%EC%BD%94%EB%93%9C%EB%84%A4%EC%9E%84b-%EB%AA%A8%EC%9D%98%ED%85%8C%EC%8A%A4%ED%8A%B8/quiz/2
    ㅇhttps://brandi.goorm.io/exam/84506/%EB%AA%A8%EC%9D%98%ED%85%8C%EC%8A%A4%ED%8A%B8-2020-%EB%B8%8C%EB%9E%9C%EB%94%94-%EC%BD%94%EB%94%A9%EB%8C%80%ED%9A%8C-%EC%BD%94%EB%93%9C%EB%84%A4%EC%9E%84b-%EB%AA%A8%EC%9D%98%ED%85%8C%EC%8A%A4%ED%8A%B8/quiz/2

     

    사은품 교환하기.

    의외로 애먹은 문제이다.

     

    사람의 수를 입력 받고, 쿠폰 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최소값이 정답이라는 것이다.

    그래서 삼항연산자를 통해 간단히 해결되었다.

     

    https://brandi.goorm.io/exam/84506/%EB%AA%A8%EC%9D%98%ED%85%8C%EC%8A%A4%ED%8A%B8-2020-%EB%B8%8C%EB%9E%9C%EB%94%94-%EC%BD%94%EB%94%A9%EB%8C%80%ED%9A%8C-%EC%BD%94%EB%93%9C%EB%84%A4%EC%9E%84b-%EB%AA%A8%EC%9D%98%ED%85%8C%EC%8A%A4%ED%8A%B8/quiz/2

    반응형

    댓글

    Designed by JB FACTORY