https://www.acmicpc.net/problem/1193
코드
#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 |