1 minute read

❓문제

나연이는 A개의 사탕을, 다현이는 B개의 사탕을 갖고 있다. 두 사람은 아래와 같은 작업을 정확히 K번 반복하려고 한다.

  • 둘 중 사탕의 개수가 더 적은 사람을 X, 더 많은 사람을 Y라고 하자. 단, 두 사람이 같은 개수의 사탕을 갖고 있다면 나연이가 X, 다현이가 Y이다.
  • X가 P개의 사탕을, Y가 Q개의 사탕을 갖고 있을 때, Y는 X에게 자신의 사탕 P개를 준다. 결과적으로 X가 가진 사탕은 2P개, Y가 가진 사탕은 Q-P개가 된다. 작업이 끝나고 난 후, 두 사람이 각각 가지고 있는 사탕의 개수를 A’,B’라고 하자. min(A’,B’)의 값은 얼마일까?

✏️입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다. 각 테스트 케이스는 하나의 줄로 이루어지며, 각 줄에는 세 개의 정수 A,B,K (1≤A,B≤109, 1≤K≤2⋅109)가 공백 하나를 사이로 두고 주어진다.

📜출력

각 테스트 케이스마다, K번의 반복 작업이 끝나고 난 후, 두 사람이 각각 가지고 있는 사탕의 개수를 A’,B’라고 할 때, min(A’,B’ )의 값을 한 줄에 하나씩 출력한다.

💻코드

/*
	13736번 : 사탕분배
	언어 : C++
	알고리즘)
		1. 일단 테스트케이스 입력받고 -> for문으로 돌릴것
		2. a,b,l 입력받고
		3. for문으로 l번 돌린다
		4. X = 2X, Y = Y-X 한 후 두수 크기 비교
		5. min(); 출력
*/

#include<iostream>
using namespace std;

int main(){
	int TestCase;
	int X, Y, L;
	int tmp;

	cin >> TestCase;
	int * res = new int[TestCase];

	for (int i = 0; i < TestCase; i++) {
		cin >> X >> Y >> L;
		
		for (int j = 0; j < L; j++) {
			
			if (X > Y) {
				tmp = Y;
				Y = X;
				X = tmp;
			}

			Y = Y - X;
			X = 2 * X;

		}
		res[i] = min(X, Y);
	}

	for (int i = 0; i < TestCase; i++)
	{
		cout << "#" << i+1 << " " << res[i] << endl;

	}
}
  • 호기롭게 코딩했으나 결과는 FAIL

  • 문제는 제한시간 초과!
    해당 문제는 150개의 테스트를 c++기준 1초의 시간을 통과 기준으로 하고있다.

  • 아니 이거 어케 해? 아무래도 일단 출력 값은 맞도록 코딩 된거같은데, 제한시간이 문제인데.. 인라인 함수 써봤자 딱히..for문은 무조건 2번은 돌아야할 것 같고 아무래도 다른 방법을 찾아야하는건가. 내가 너무 투박하게 1차원적으로 코딩한거같긴 한데..