DY N DY

문제은행 합과 평균 표준편차(C++) 본문

PARK/ALGORITHM

문제은행 합과 평균 표준편차(C++)

손세지 2016. 4. 13. 14:54

1004 : 합과 평균 표준편차

제한시간: 1Sec    메모리제한: 32mb
해결횟수: 309회    시도횟수: 2289회   



도시락 집 회계 담당을 하는 철기는 손님들이 드시는 음식의 가격들을 집계하여 매일 이들의 합산 가격과 평균 도시락 가격과 표준 편차를 구해야 하는 임무를 가지고 있다. 매일 업무 종료 때마다 이를 구해야하는 철기군 처음에는 직접 계산하다가 매일 바뀌는 도시락 수와 가격에 복잡함을 느껴 이를 프로그램으로 만들려고 한다.

평균 및 표준편차는 반올림해서 소수점 첫째 자리까지 구한다. 표준 편차의 공식은 도시락 각각의 가격을 Xi라고 하고 평균을 M이라고 한다면 다음과 같다.

 

e3050b66a1b29a01767400d7560a4131_1449735
 

 

표준편차란 자료의 분산 정도를 나타내는 수치로 분산의 양의 제곱근으로 표준 편차가 작은 것은 평균값 주위의 분산의 정도가 작은 것을 나타낸다.

 

첫 번째 줄에는 도시락의 수 n(1부터 100사이의 정수)이 입력되고 다음 줄부터 n개의 줄에는 각 도시락의 가격(1,000부터 4,000사이의 정수)들을 입력받는다.

하나의 결과가 출력되면 프로그램을 종료한다.데이터의 크기가 주어진 범위를 벗어나는 데이터는 입력되지 않는다.



위에서 입력한 자료에 맞추어서 도시락 가격의 총 합과 평균 가격 표준편차를 출력한다.

평균과 표준편차는 소수점이하 첫째자리까지 출력한다.

단 소수점이하 첫째자리가 0일 경우는 출력하지 않는다.


 [Copy]
3
1500
2000
2500
 [Copy]
6000
2000
408.2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/**************************************************************
    Problem: 1004
    User: a132034
    Language: C++
    Result: Success
    Time:0 ms
    Memory:1764 kb
****************************************************************/
 
 
#include    <iostream>
#include    <math.h>
 
using namespace std;
 
int main()
{
    int n;
    int * ary;
 
    cin >> n;
    ary = new int[n];
    for (int i = 0; i < n; ++i)
        cin >> ary[i];
 
    int sum = 0;
    double avg = 0;
    double dev = 0;
 
    for (int i = 0; i < n; ++i)
        sum += ary[i];
 
    avg = sum / (double)n;
    avg += 0.05;
 
     
 
    for (int i = 0; i < n; ++i)
    {
        dev += (avg - ary[i]) * (avg - ary[i]);
    }
 
    dev /= (double)n;
    dev = sqrt(dev);
    dev += 0.05;
     
    printf("%d\n", sum);
     
    if (int(avg * 10) % 10 == 0)
        printf("%.lf\n", avg);
    else
        printf("%.1lf\n", avg-0.05);
     
    if (int(dev * 10) % 10 == 0)
        printf("%.lf\n", dev);
    else
        printf("%.1lf\n", dev - 0.05);
 
    return 0;
}

다른건 크게 어렵지 않은데 소수점이하 첫째자리가 0일 경우 출력하지 않는 방법을 고민하는데 시간이 조금 걸림. 

string으로 바꿔서 .이하의 부분이 .0이면 날려버리는 방법도 생각해 봤으나.. 더 간단하게 처리하려고 고민해보니 

0.05를 더해서 10을 곱했다가 10을 나누어본 나머지가 0이라면 소수점이하 자리가 1이 되지 않는다(0이다)는 것이므로 없이 출력. 

나머지가 0보다 크다면 소수점 이하 첫째자리를 출력하면 된다.

ex) 2000.03의 경우 -> 2000.03 + 0.05 = 2000.08 >> *10 %10 >> 20000.8%10 = 0 >> 이 경우 소수점 첫째자리가 0

    2000.06의 경우 -> 2000.06 + 0.05 = 2000.11 >> *10 %10 >> 20001.1%10 = 1 >> 이 경우 소수점 첫째자리가 0이 아님.