본문 바로가기

Algorithm/문제풀이

[백준] 1193번: 분수찾기

문제링크 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