문제링크 : https://www.acmicpc.net/problem/1193
문제풀이
찾을 수 있는 규칙
1. 위의 표는 분자와 분모 합이 같은 것끼리 한 줄에 나열한 것이다.
2. 최대 분모는 순차적으로 늘어난다.
3. 최대 분모가 짝수일 때와 홀수일 때 분자 분모가 증가하는 모양이 서로 반대이다.
4. 분자와 분모가 1씩 증가, 감소한다.
그러면 우선, 입력받은 숫자의 최대 분모가 몇인지부터 알아야 한다.
각 줄의 제일 큰 수 (1, 3, 5, 10, 15 ...)로 비교를 하면 되겠다.
while (sum < N) { sum += ++max_denominator; }
순차적으로 더하면서 입력받은 숫자의 최대 분모(max_denominator)가 몇인지, 그 줄의 제일 큰 수(sum)는 몇인지 알아낸다.
분모는 위에서 구한 최대 분모 값으로 설정하고, 분자는 1로 설정한다.
그 줄의 제일 큰 수(sum)부터 입력받은 값(N)까지 분모는 1씩 감소, 분자는 1씩 증가시킨다.
for (int i = sum; i > N; i--) { denominator--; numerator++; }
예) 입력값이 14인 경우, sum은 15가 되고 최대 분모 값은 5가 된다.
그러면 for문을 돌면서 i가 14보다 클 때까지 분모는 감소, 분자는 증가되어 분모는 4, 분자는 2값이 된다.
마지막으로 위의 표를 보면 최대 분모값이 짝수일 때와 홀수일 때 커지는 순서가 다르다.
이를 위해 짝수인 경우에는 분자와 분모 값을 바꿔서 출력한다.
if (max_denominator % 2 == 0) { cout << denominator << '/' << numerator; } else { cout << numerator << '/' << denominator; }
소스코드
/* * 백준 1193번: 분수찾기 */ #include <iostream> using namespace std; int main() { int N; cin >> N; int sum = 1; int max_denominator = 1; while (sum < N) { sum += ++max_denominator; } int denominator = max_denominator; // 분모 int numerator = 1; // 분자 for (int i = sum; i > N; i--) { denominator--; numerator++; } if (max_denominator % 2 == 0) { cout << denominator << '/' << numerator; } else { cout << numerator << '/' << denominator; } return 0; }
'Algorithm > 문제풀이' 카테고리의 다른 글
[백준] 10250번: ACM 호텔 (0) | 2019.05.18 |
---|---|
[백준] 1011번: Fly me to the Alpha Centauri (0) | 2019.05.18 |
[백준] 2292번: 벌집 (0) | 2019.03.22 |
[백준] 2438번: 별 찍기 - 1 (0) | 2019.03.18 |
[백준] 1152번: 단어의 개수 (0) | 2019.03.18 |