: solved.ac - bronze 2

https://www.acmicpc.net/problem/1297

 

1297번: TV 크기

김탑은 TV를 사러 인터넷 쇼핑몰에 들어갔다. 쇼핑을 하던 중에, TV의 크기는 그 TV의 대각선의 길이로 나타낸 다는 것을 알았다. 하지만, 김탑은 대각선의 길이가 같다고 해도, 실제 TV의 크기는

www.acmicpc.net

 

 

예제 입력

52 9 16

 

예제 출력

25 45

 

정답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

int main() {
	int d, h, w;
	double i, hi, wi;

	scanf("%d %d %d", &d, &h, &w);
	i = d * d;
	i /= (h * h) + (w * w);
	i = sqrt(i);
	hi = h * i;
	wi = w * i;

	printf("%.0lf %.0lf", floor(hi), floor(wi));

	return 0;
}


해설

: 이하의 수학적 계산을 구현한다.

(h=높이 비율, w=너비 비율, i=비율과 실제 수치 간에 곱해진 계수, d=대각선 길이)

(hi)^2 + (wi)^2 = d^2

d^2 = h^2*i^2 + w^2i^2

       = i^2 (h^2 + w^2)

i^2 = d^2 / (h^2 + w^2)

위의 계산으로 i의 값을 구한 후

hi = 실제 높이값, wi = 실제 너비값이므로 그를 구한다.

 

 

1. 루트 계산인 sqrt() 함수와 바닥(소숫점 아래 버림)함수인 floor()를 활용하기 위해 math.h 헤더파일을 가져왔다.

d, h, w는 문제에서 정수로 주어지나 i, hi, wi는 정수로 나오지 않을 가능성이 크므로 double형을 택한다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>

int main() {
	int d, h, w;
	double i, hi, wi;

 

2. d의 제곱을 먼저 i에 집어넣은 뒤 (double로 묵시적 형변환하기 위함)

이를 h제곱+w제곱 값으로 나눈다. (이 값이 double이 되어야 하기 때문에 계산은 i변수가 반드시 얽히도록 한다.)

위에서 계산된 값은 i의 제곱이므로 sqrt() 함수로 제곱근을 씌운 뒤

h와 w에 각각 곱하여, 문제의 조건대로 floor()함수를 이용해 버림한 뒤

소숫점 아래가 출력되지 않는 실수 형식으로 출력한다.

	scanf("%d %d %d", &d, &h, &w);
	i = d * d;
	i /= (h * h) + (w * w);
	i = sqrt(i);
	hi = h * i;
	wi = w * i;

	printf("%.0lf %.0lf", floor(hi), floor(wi));

	return 0;
}

'C언어 > BAEKJOON' 카테고리의 다른 글

[백준] 1764. 듣보잡  (0) 2022.09.18
[백준] 1152. 단어의 개수  (0) 2022.09.18
[백준] 2033. 반올림  (0) 2022.08.28
[백준] 1076. 저항  (0) 2022.08.18
[백준] 1009. 분산처리  (0) 2022.08.18

+ Recent posts