본문 바로가기
백준

백준 1214번 쿨한 물건 구매 (c++)

by 딴짓거리 2025. 1. 17.

 

솔직히 이런문제 50000문제 풀어도 무슨 의미가 있다 싶다

어짜피 또 다른 정수론 다루면 못맞추는건 매한가지 아닌가?

 

단순 브루트포스인줄 알고 이게 왜 플레5에 박혀있나 싶었지만 시간안에 해결하기 위해서 수학적으로 한번 더 생각해야 하는문제였고 답을 봤는데도 별로 와닿지는 않는다

 

cin >> d >> p >> q;
if (q > p)
{
	swap(p, q);
}
if (d % p == 0 || d % q == 0)
{
	cout << d << endl;
	return 0;
}

 

입력을 받고 p가 항상 큰 값을 가리키도록 처리해준다.

입력받은 지폐가 목표액의 약수이면 즉시 목표액을 만들 수 있으므로 바로 답을 출력한다.

 

ans = (d / p) * p + p;
ll maxi = ans;

ans는 일단 p로만 만들 수 있는 목표액보다 큰 가장 작은 수이다.

maxi는 루프 중 사용할 값이고 ans부터 시작한다.

 

for (int i = 1; i <= maxi / p; i++)
{
	ll current = maxi - (p * i);

	if ((d - current) % q == 0)
	{
		cout << d << endl;
		return 0;
	}
	else
	{
		current += ((d - current) / q) * q + q;
	}

	if (ans == current) break;
	ans = min(ans, current);
}

 기본적으로 D<= nP + mQ 를 구해야하는 문제이기 때문에

ans에서 P 성분을 점점 줄여나가고 그만큼을 Q 성분들로 채워나가며 최솟값을 찾아야한다.

 

for문을 돌며 maxi에서 p * i값을 빼면 현재 채워진 p의 합인 current가 생기고

d - current는 q로 채워야 할 나머지가 된다

이 시점에서 d - current가 q로 나누어 떨어지면 d값을 정확히 만들 수 있다는 뜻이므로 결과를 반환한다.

 

그게 아니라면 마찬가지로 합이 d를 넘도록 남은 공간을 q로 채우고 루프를 돌린다.

이때 초기값 ans와 current가 같다는 뜻은 결과값의 사이클이 생겼다는 뜻이므로 더 루프를 돌 의미가 없다

 

 

'백준' 카테고리의 다른 글

백준 17142번 연구소 3 (c++)  (0) 2025.01.21
백준 15683번 감시 (c++)  (0) 2025.01.18
백준 9202번 Boggle (c++)  (0) 2025.01.16
백준 19566번 수열의 구간 평균 (c++)  (0) 2025.01.12
백준 2579번 문제- 계단 오르기  (0) 2021.11.13