-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
99 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
--- | ||
layout: single | ||
title: "[백준 7947] Koncert (C#, C++) - soo:bak" | ||
date: "2023-08-05 13:34:00 +0900" | ||
description: 문자열, 구현 등을 주제로 하는 백준 7947번 문제를 C++ C# 으로 풀이 및 해설 | ||
--- | ||
|
||
## 문제 링크 | ||
[7947번 - Koncert](https://www.acmicpc.net/problem/7947) | ||
|
||
## 설명 | ||
특정 색상을 만들기 위해 `10` 개의 램프를 사용했을 때, 각 램프의 색상을 입력받아 최종 색상의 `RGB` 값을 계산하는 문제입니다.<br> | ||
<br> | ||
각 램프의 `0` 과 `255` 사이의 `RGB` 색상값을 입력받은 후 각 색상값들을 더하고,<br> | ||
<br> | ||
램프의 수인 `10` 으로 나누어 평균을 계산합니다.<br> | ||
<br> | ||
이후, 평균을 가장 가까운 정수로 반올림하여 게산된 평균 색상을 출력합니다.<br> | ||
<br><br><br> | ||
`C#` 의 `Math.Round()` 메서드는 과 `C++` 의 `round()` 함수와 작동방식이 다름에 주의합니다. <br> | ||
<br> | ||
`C++` 의 `round()` 함수는 반올림할 값이 정확히 중간에 위치하면(즉, `.5` 인 경우),<br> | ||
<br> | ||
가장 가까운 짝수로 반올림하지 않고, 반드시 큰 쪽으로 반올림합니다.<br> | ||
<br> | ||
예를 들어 `2.5` 는 `3` 으로, `3.5` 는 `4` 로 반올림됩니다. | ||
<br><br> | ||
반면, `C#` 의 `Math.Round` 메서드는 기본적으로 `Banker's rounding` 을 사용합니다.<br> | ||
<br> | ||
이는 반올림할 값이 정확히 중간에 위치하면 가장 가까운 `짝수` 로 반올림 대상을 선택합니다. <br> | ||
<br> | ||
예를 들어, `2.5` 를 반올림하면 `2` 가 되고, `3.5` 를 반올림하면 `4` 가 됩니다. <br> | ||
<br> | ||
따라서, 중간값을 무조건 큰 쪽으로 반올림하려는 경우, <br> | ||
<br> | ||
`Math.Round()` 메서드의 두 번째 인수로 `MidpointRound` 열거형을 이용하여 반올림의 방식을 변경해주어야 합니다.<br> | ||
|
||
- - - | ||
|
||
## Code | ||
<b>[ C# ] </b> | ||
<br> | ||
|
||
```c# | ||
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}"); | ||
} | ||
|
||
} | ||
} | ||
} | ||
``` | ||
<br><br> | ||
<b>[ C++ ] </b> | ||
<br> | ||
|
||
```c++ | ||
#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; | ||
} | ||
``` |