[C++] 백준 2597번: 줄자접기

be_clever·2022년 1월 15일
0

Baekjoon Online Judge

목록 보기
31/172

문제 링크

2597번: 줄자접기

문제 요약

줄자가 있고, 줄자 위에는 빨간점, 파란점, 노란점이 한 쌍씩 있다. 줄자를 빨간점, 파란점, 노란점이 순서대로 붙도록 접어줄 때, 줄자의 최종 길이를 구해야 한다.

접근 방법

간단한 구현 문제라고 생각했지만 생각보다는 시간이 많이 걸린 것 같습니다.

l, r이라는 변수를 선언하고, 처음에는 0, (줄자의 길이)로 각각 초기화를 해둡니다.

빨간점의 중간값인 mid를 구하고, 절댓값을 이용해서 파란점들, 노란점들과 l, r의 값을 업데이트 해줍니다. 이때, mid가 l, r의 중간값보다 오른쪽인지, 또는 왼쪽인지에 따라서 l, r의 값을 다르게 주어야 합니다.

파란점도 마찬가지로 진행하고, 노란점들과 l, r의 값을 업데이트 해줍니다.

마지막으로 노란점의 중간값을 구하고 l, r의 값을 업데이트 해줍니다.

결과적으로 l, r의 차를 약간 변형해서 출력해주면 됩니다.

사실 한 번에 맞출 수도 있었던 문제인데 소수 첫째자리까지만 출력하라는 조건에서 실수를 해서 몇 차례 WA를 받았습니다. std::cout.precision을 이용했는데, 소수 두번째자리에서 반올림이 되는 것을 캐치하지 못하였습니다.

std::cout을 사용하려다보니 코드가 길어졌는데, printf를 사용하는 것이 더 좋았을 것 같습니다.

코드

#include <bits/stdc++.h>

using namespace std;

pair<double, double> arr[3];

double update(double mid, double num) { return mid + fabs(mid - num); }

void func(int idx, double& l, double& r)
{
	if (arr[idx].first == arr[idx].second)
		return;

	double mid = (arr[idx].first + arr[idx].second) / 2;

	for (int i = idx + 1; i < 3; i++)
	{
		arr[i].first = update(mid, arr[i].first);
		arr[i].second = update(mid, arr[i].second);
	}

	l = update(mid, l);
	if (l > r)
		r = l;
	l = mid;
}

int main(void)
{
	double len;
	cin >> len;

	double left = 0, right = len;

	for (int i = 0; i < 3; i++)
		cin >> arr[i].first >> arr[i].second;

	for (int i = 0; i < 3; i++)
		func(i, left, right);

	double res = right - left;
	res *= 10;
	res = floor(res);
	res /= 10;
	cout << fixed;
	cout.precision(1);
	cout << res;
	return 0;
}
profile
똑똑해지고 싶어요

0개의 댓글