문제 링크입니다: https://www.acmicpc.net/problem/14919
주어진 실수들이 M개의 구간 중 어느 구간에 속하는지를 구하는 문제였습니다.
실수는 부동소수점(https://ko.wikipedia.org/wiki/%EB%B6%80%EB%8F%99%EC%86%8C%EC%88%98%EC%A0%90) 방식을 적용하기 때문에 실수를 직접 연산하는 것은 위험합니다.
문제에서 소수들은 최대 6자리까지 주어진다고 했으므로 실수에 부동소수점을 고려하여 0.0000000001을 더해준 다음1,000,000을 곱해서 정수로 만들어준 다음 범위를 구하는 것이 핵심이였습니다.
또한 M으로 나누었을 때 나누어떨어지는 숫자들이 있는 반면 소수점 아래 숫자들이 무한히 전개되는 숫자들도 존재합니다.(예를 들어 1,000,000을 3으로 나눌 경우 333,333.3333333333...)
따라서, 이런 숫자들에 대해서는 범위를 +1 해줘야 정확한 답을 구할 수 있습니다!
#include <iostream>
#include <vector>
using namespace std;
const int MAX = 1000;
int M;
int range[MAX];
int result[MAX];
int main(void)
{
cin >> M;
//기준
double criteria = (double)1 / M + 0.0000000001;
//범위의 한계를 지정
for (int i = 0; i < M; i++)
{
range[i] = (i + 1) * criteria * 1000000;
//(i + 1) * 1,000,000을 M으로 나누었을 때 소수점이 무한대로 늘어날 경우 1을 더해준다
if (((i + 1) * 1000000) % M)
range[i]++;
}
double num;
do
{
cin >> num;
num += 0.0000000001;
num *= 1000000;
//범위를 찾는다
if (0 <= num && num < range[0])
result[0]++;
else
{
for (int i = 1; i < M; i++)
if (range[i - 1] <= num && num < range[i])
{
result[i]++;
break;
}
}
} while (getc(stdin) == ' ');
for (int i = 0; i < M; i++)
cout << result[i] << " ";
cout << "\n";
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 14923번 미로 탈출 (0) | 2018.07.13 |
---|---|
백준 14922번 부분평균 (0) | 2018.07.13 |
백준 9328번 열쇠 (5) | 2018.07.11 |
백준 10814번 나이순 정렬 (2) | 2018.07.11 |
백준 11652번 카드 (0) | 2018.07.11 |