문제
김탑은 TV를 사러 인터넷 쇼핑몰에 들어갔다. 쇼핑을 하던 중에, TV의 크기는 그 TV의 대각선의 길이로 나타낸 다는 것을 알았다. 하지만, 김탑은 대각선의 길이가 같다고 해도, 실제 TV의 크기는 다를 수도 있다는 사실에 직접 TV를 보러갈걸 왜 인터넷 쇼핑을 대각선의 길이만 보고있는지 후회하고 있었다.
인터넷 쇼핑몰 관리자에게 이메일을 보내서 실제 높이와 실제 너비를 보내달라고 했지만, 관리자는 실제 높이와 실제 너비를 보내지 않고 그것의 비율을 보내왔다.
TV의 대각선 길이와, 높이 너비의 비율이 주어졌을 때, 실제 높이와 너비의 길이를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 TV의 대각선 길이 D, TV의 높이 비율 H, TV의 너비 비율 W이 공백 한 칸을 사이에 두고 주어진다.
출력
첫째 줄에 TV의 높이와 TV의 너비를 공백 한 칸을 이용해서 구분지은 후 출력한다. 만약, 실제 TV의 높이나 너비가 소수점이 나올 경우에는 그 수보다 작으면서 가장 큰 정수로 출력한다. (예) 1.7 -> 1
풀이
피타고라스의 정리를 이용해서 풀어야 한다. A^2+B^2=C^2 공식을 이용한다.
대각선의 길이를 c, 높이 비율과 너비 비율을 각각 a,b에 대입한다.
여튼간에 높이와 너비는 비율로 주었기 때문에 미지수를 하나 정하여 그 미지수의 값을 구한 다음 높이와 너비의 실제길이를 구하여 출력시키면 된다.
예를 들어 미지수를 k라 가정하면, (ak)^2+(bk)^2=c^2가 된다. 이제 코드에서는 k를 정의해야하기 때문에 k에 관한 식으로 정리해주면 k=sqrt(c^2/(a^2+b^2)가 된다.
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int d, h, w;
cin >> d >> h >> w;
double k = sqrt((double)(d*d)/(h*h+w*w));//(double)로 형변환시켜줘야 정수가 아닌 실수로 저장됨
int hi = floor(k*h); //반올림함수floor
int wei = floor(k*w);
cout << hi << " " << wei;
return 0;
}
'백준풀기' 카테고리의 다른 글
[c++] 백준 2525번 오븐시계 (1) | 2024.01.23 |
---|---|
[c++] 백준 1094번 막대기 (2진수) (2) | 2024.01.23 |
[c++] 백준 1009번 분산처리 (pow함수를 지양해야 하는 이유) (2) | 2024.01.22 |
[c++] 백준 5597번 과제 안 내신 분 (0) | 2024.01.22 |
[c++] 백준 1259번 팰린드롬(회문) (0) | 2024.01.17 |