작성일 :

문제 링크

7947번 - Koncert

설명

특정 색상을 만들기 위해 10 개의 램프를 사용했을 때, 각 램프의 색상을 입력받아 최종 색상의 RGB 값을 계산하는 문제입니다.

각 램프의 0255 사이의 RGB 색상값을 입력받은 후 각 색상값들을 더하고,

램프의 수인 10 으로 나누어 평균을 계산합니다.

이후, 평균을 가장 가까운 정수로 반올림하여 게산된 평균 색상을 출력합니다.



C#Math.Round() 메서드는 과 C++round() 함수와 작동방식이 다름에 주의합니다.

C++round() 함수는 반올림할 값이 정확히 중간에 위치하면(즉, .5 인 경우),

가장 가까운 짝수로 반올림하지 않고, 반드시 큰 쪽으로 반올림합니다.

예를 들어 2.53 으로, 3.54 로 반올림됩니다.

반면, C#Math.Round 메서드는 기본적으로 Banker's rounding 을 사용합니다.

이는 반올림할 값이 정확히 중간에 위치하면 가장 가까운 짝수 로 반올림 대상을 선택합니다.

예를 들어, 2.5 를 반올림하면 2 가 되고, 3.5 를 반올림하면 4 가 됩니다.

따라서, 중간값을 무조건 큰 쪽으로 반올림하려는 경우,

Math.Round() 메서드의 두 번째 인수로 MidpointRound 열거형을 이용하여 반올림의 방식을 변경해주어야 합니다.


Code

[ C# ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace Solution {
  class Program {
    static void Main(string[] args) {

      var z = int.Parse(Console.ReadLine()!);

      for (int i = 0; i < z; i++) {
        int sumR = 0, sumG = 0, sumB = 0;
        for (int j = 0; j < 10; j++) {
          var rgb = Console.ReadLine()!.Split(' ').Select(int.Parse).ToArray();
          sumR += rgb[0];
          sumG += rgb[1];
          sumB += rgb[2];
        }
        sumR = (int)Math.Round(sumR / 10.0, MidpointRounding.AwayFromZero);
        sumG = (int)Math.Round(sumG / 10.0, MidpointRounding.AwayFromZero);
        sumB = (int)Math.Round(sumB / 10.0, MidpointRounding.AwayFromZero);
        Console.WriteLine($"{sumR} {sumG} {sumB}");
      }

    }
  }
}



[ C++ ]

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
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int z; cin >> z;

  for (int i = 0; i < z; i++) {
    int sumR = 0, sumG = 0, sumB = 0;
    for (int j = 0; j < 10; j++) {
      int r, g, b; cin >> r >> g >> b;
      sumR += r;
      sumG += g;
      sumB += b;
    }
    cout << round((double)sumR / 10) << " "
         << round((double)sumG / 10) << " "
         << round((double)sumB / 10) << "\n";
  }

  return 0;
}