[백준 23292] 생체리듬 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
이 문제는 어떤 기준 생일(8자리 숫자)과 여러 날짜를 비교하여
생체 유사도 지수가 가장 높은 날짜를 구하는 문제입니다.
생체 유사도는 다음과 같은 방식으로 계산됩니다:
- 생년월일은 8자리 (
YYYYMMDD
)로 주어집니다. - 이를 세 그룹으로 나누어 계산합니다:
- 연(4자리)
- 월(2자리)
- 일(2자리)
- 각 그룹 내의 같은 자릿수끼리 차를 제곱한 뒤 더한 값을 계산한 후, 세 그룹의 값을 모두 곱한 결과가 해당 날짜의 생체 유사도입니다.
접근법
- 입력된 생일과 각 날짜를 비교합니다.
- 연도 4자리 → 월 2자리 → 일 2자리로 나누고, 대응되는 자릿수끼리의 제곱차 합을 구합니다.
- 각 그룹마다 합을 구하고, 최종적으로 세 값을 모두 곱한 결과를 사용합니다.
- 생체 유사도가 가장 높은 날짜를 찾되, 동률인 경우 더 이른 날짜를 선택합니다.
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Linq;
namespace Solution {
class Program {
static int Biorhythm(int birth, int now) {
int[] groupLens = { 2, 2, 4 };
int ans = 1;
foreach (var g in groupLens) {
int part = 0;
for (int i = 0; i < g; i++) {
int bd = birth % 10;
int nw = now % 10;
part += (bd - nw) * (bd - nw);
birth /= 10;
now /= 10;
}
ans *= part;
}
return ans;
}
static void Main(string[] args) {
var birth = int.Parse(Console.ReadLine()!);
var n = int.Parse(Console.ReadLine()!);
int maxVal = -1, minDate = int.MaxValue;
for (int i = 0; i < n; i++) {
int now = int.Parse(Console.ReadLine()!);
int score = Biorhythm(birth, now);
if (score > maxVal || (score == maxVal && now < minDate)) {
maxVal = score;
minDate = now;
}
}
Console.WriteLine(minDate);
}
}
}
[ 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
using namespace std;
int biorhythm(int birthday, int now) {
int ans = 1;
int groupsDigits[] = {2, 2, 4};
for (int g : groupsDigits) {
int tmp = 0;
for (int i = 0; i < g; i++) {
tmp += (birthday % 10 - now % 10) * (birthday % 10 - now % 10);
birthday /= 10;
now /= 10;
}
ans *= tmp;
}
return ans;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int birthday, n, now, maxVal = -1, minDate = 2e9;
cin >> birthday >> n;
while (n--) {
cin >> now;
int val = biorhythm(birthday, now);
if (val > maxVal || (val == maxVal && now < minDate)) {
maxVal = val;
minDate = now;
}
}
cout << minDate << "\n";
return 0;
}