PS (C, C++)

[백준/C] 1193 분수찾기

최연재 2022. 8. 19. 23:25

https://www.acmicpc.net/problem/1193

 

1193번: 분수찾기

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

www.acmicpc.net

 

코드

#include <stdio.h>

int sum = 1;

int findNumber(int n)
{
	int i = 2;
	while (1)
	{
		if (sum >= n) return i;
		sum += i;
		i++;
	}
}

void result(int n, int numSum)
{
	if (numSum % 2 == 0) printf("%d/%d", sum - n+1, numSum - (sum - n)-1);
	else printf("%d/%d", numSum - (sum - n)-1, sum - n+1);
}

int main()
{
	int n;
	scanf("%d", &n);
	if (n == 1) printf("%d/%d\n", 1, 1);
	else
	{
		int numSum = findNumber(n);
		result(n, numSum);
	}
	return 0;
}

 

 

코드 설명

메인함수

입력을 받고, 1일 경우 1/1을 바로 출력한다. 

1이 아닐 경우에는 findNumber 함수를 이용해서 numSum을 구하고, result 함수를 이용해 결과를 출력한다. 

 

findNumber 함수

입력받은 n을 인수로 받는다. 

이 함수는 n번째 분수의 분자와 분모의 합을 반환하는 함수이다. 

 위 표는 분수에 따른 순서를 나타냈는데, 색이 칠해진 분수의 순서를 보면 1, 1+2, 1+2+3, 1+2+3+4이다. 

findNumber 함수는 sum에다가 2,3,4를 점점 더해나가다가 sum이 n보다 크거나 같을 때 더해준 값인 i를 반환한다. 

sum을 전역변수로 선언한 이유는 result함수에서 이를 그대로 사용하기 때문이다.

 

result 함수

사실 이 함수는 함수 없이 내용을 그대로 메인함수에 적어도 상관없지만 좀 더 깔끔한 코드를 위해 함수로 분리했다. 

위의 표를 보면 합이 홀수이면 분자가 1에서 시작하고, 합이 짝수이면 분모가 1에서 시작하는 것을 알 수 있다. 

그래서 numSum을 인수로 받아서 홀수인지 짝수인지 여부를 파악해서 if문으로 홀짝의 경우를 각각 나눈다. 

 

numSum % 2 == 0인 경우 sum - n+1이 분자, numSum - (sum - n)-1이 분모가 된다.

numSum % 2 == 1인 경우에는 numSum % 2 == 0인 경우의 분모, 분자를 서로 뒤바꾸면 된다. 

 

숫자로 예시를 들면 입력으로 7이 들어온다면 numSum은 5가 되고, sum은 10이 된다. 

분모는 sum-n+1에 10, 7을 대입하면 4가 된다. 

분자와 분모의 합이 numSum이므로 분자는 1이 된다. 

 

 

느낀 점

처음에는 어떻게 접근해야 할 지 감도 못 잡았다. 위의 표를 만들면서 규칙성을 찾았고, 규칙성을 바탕으로 코드를 짜니 성공했다.  문제 풀 때 옆에 종이가 필수라는 걸 느꼈던 문제였다. 

'PS (C, C++)' 카테고리의 다른 글

[백준/C] 반복문  (0) 2022.08.20
[백준/C] 조건문  (0) 2022.08.20
[백준/C] 입출력과 사칙연산  (0) 2022.08.20
[백준/c] 1292 쉽게 푸는 문제  (0) 2022.08.20
[백준/C] 9996 한국이 그리울 땐 서버에 접속하지  (0) 2022.08.19