문제
동혁이는 졸업을 하기 위해 일반 화학 실험을 들어야 한다. 마지막 실험은 어떤 혼합물을 만든 뒤 온도를 1분에 한 번씩 잰 후, 1분동안 변화한 온도를 표로 만들어야 한다.
뛰어난 프로그래머인 동혁이는 혼합물의 온도를 자동으로 측정해주는 프로그램을 만들었다. 하지만, 깜빡하고 변화한 온도를 자동으로 계산해주는 프로그램을 만들지 않았다.
동혁이가 측정한 온도가 주어졌을 때, 변화한 온도를 구하는 프로그램을 작성하시오.
입력
입력은 동혁이가 측정한 혼합물의 온도가 순서대로 주어진다. 온도는 -10도와 200도 사이이고, 소수점 둘째자리까지 적혀져 있을 수도 있다. 마지막 측정 후에는 999가 주어진다. 동혁이는 온도를 적어도 2번 측정했다.
출력
입력으로 주어진 각 온도와 이전 온도와의 차이를 출력한다. 첫 번째 측정할 온도는 이전 온도가 없으니 출력할 필요가 없다. 차이는 항상 소수점 둘째자리까지 출력한다.
출처
ICPC > Regionals > North America > Mid-Atlantic Regional > 2003 Mid-Atlantic Regional Programming Contest P번
ICPC > Regionals > North America > Mid-Atlantic Regional > 2002 Mid-Atlantic Regional Programming Contest A번
- 문제를 번역한 사람: baekjoon
아래는 정답코드이다.
#include<stdio.h>
int main(){
float a;
scanf("%f",&a);
float b;
while(1){
scanf("%f",&b);
if(b == 999)
break;
printf("%.2f\n",b-a);
a = b;
}
}
이번 문제는 특이하게도 무한 반복문을 만들고 정해진 조건에 의해서 반복문이 종료되는 코드를 작성하라고 요청하였다. 코딩 테스트에서는 많은 사람들이 무한 반복문에 빠지게 될경우 서버에 과부하가 올 가능성이 있기에 자주 없는 패턴일 것이다. 하지만, 어려운 것은 아니니 이러한 문제가 등장하든 등장하지 않든 문제될 것은 없다.
이 문제도 굉장히 간단한 문제이고, 단순히 빼기 연산과 이전 값을 저장해놓고 다시 활용하는 형태로 코드 작성시 쉽게 해결할 수 있다.
그런데 나는 저 문제를 왜 틀렸던 것일까? 한번 코드를 봐야겠다.
#include<iostream>
using namespace std;
int main(){
float a;
cin >> a;
float b;
while(1){
cin >> b;
if(b == 999)
break;
cout << b - a << '\n';
a = b;
}
}
추측하건데 당시 C++ 을 공부하던 중이라
소수점 출력 방식을 알지 못 했던 것으로 보인다.
C++의 cout 은 출력을 해주는 함수인데, C언어 처럼 %.2f 와 같이 출력 형태를 지정하는 방법을 알 수가 없다.
C++에서 소수점 자리수를 지정하는 방법은 precision() 함수와 fixed를 이용해야 한다.
만일 위 문제처럼 소수점 둘째자리까지 출력을 하고 싶다면
cout << fixed
cout.precision(2);
fixed는 소수점을 고정시켜 표현하겠다는 뜻이며
precision은 2자리까지 표현을 하겠다는 뜻입니다.
그러므로 아래와 같이 작성을 하시면 됩니다.로 작성하면 된다.
#include<iostream>
using namespace std;
int main(){
float a;
cin >> a;
float b;
cout << fixed;
cout.precision(2);
while(1){
cin >> b;
if(b == 999)
break;
cout << b - a << '\n';
a = b;
}
}
이상 다이어릿 이었습니다!