[백준 7947] Koncert (C#, C++) - soo:bak
작성일 :
문제 링크
설명
특정 색상을 만들기 위해 10
개의 램프를 사용했을 때, 각 램프의 색상을 입력받아 최종 색상의 RGB
값을 계산하는 문제입니다.
각 램프의 0
과 255
사이의 RGB
색상값을 입력받은 후 각 색상값들을 더하고,
램프의 수인 10
으로 나누어 평균을 계산합니다.
이후, 평균을 가장 가까운 정수로 반올림하여 게산된 평균 색상을 출력합니다.
C#
의 Math.Round()
메서드는 과 C++
의 round()
함수와 작동방식이 다름에 주의합니다.
C++
의 round()
함수는 반올림할 값이 정확히 중간에 위치하면(즉, .5
인 경우),
가장 가까운 짝수로 반올림하지 않고, 반드시 큰 쪽으로 반올림합니다.
예를 들어 2.5
는 3
으로, 3.5
는 4
로 반올림됩니다.
반면, 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;
}