백준 웹사이트 "1193번 - 분수찾기" 문제풀이입니다.
언어는 C언어입니다. (제출 언어: C99)
문제
소스 코드
#include <stdio.h>
int main(void){
/*
X = 1 : 1/1
X = 2 ~ 3 : 1/2 ~ 2/1
X = 4 ~ 6 : 3/1 ~ 1/3
X = 7 ~ 10 : 1/4 ~ 4/1
...
X = 1+2+...+(n-1)+1 ~ 1+2+...+n : 1/n ~ n/1 (n: 짝수)
X = 1+2+...+(n-1)+1 ~ 1+2+...+n : n/1 ~ 1/n (n: 홀수)
*/
int X;
scanf("%d", &X);
int n=1;
while(1){
// X = 1+2+...+(n-1)+1 ~ 1+2+...+n -> X = (n-1)*n/2 + 1 ~ n*(n+1)/2
if((n-1)*n/2+1<=X && X<=n*(n+1)/2){ // X의 범위 찾기
break;
}
n++;
}
int numerator, denominator;
if(n%2==0){ //n이 짝수
numerator = X-(n-1)*n/2; //분자
denominator = (n+1) - numerator; //분모
}
else{ //n이 홀수
denominator = X-(n-1)*n/2; //분모
numerator = (n+1) - denominator; //분자
}
printf("%d/%d", numerator, denominator);
}
문제 풀이
규칙만 찾으면 코드 작성은 크게 어렵지 않은 문제입니다. 지그재그로 분수들을 적기 때문에, 짝수번째 대각선과 홀수번째 대각선은 분수들이 반대로 쓰입니다. 이를 고려하여 분수들을 보면, 아래와 같은 규칙을 찾을 수 있습니다.
X = 1 : 1/1
X = 2 ~ 3 : 1/2 ~ 2/1
X = 4 ~ 6 : 3/1 ~ 1/3
X = 7 ~ 10 : 1/4 ~ 4/1
X = 1+2+...+(n-1)+1 ~ 1+2+...+n : 1/n ~ n/1 (n: 짝수)
X = 1+2+...+(n-1)+1 ~ 1+2+...+n : n/1 ~ 1/n (n: 홀수)
1/1부터 첫 번째 대각선이라고 생각했을 때, n번째 대각선에는 1/n 부터 n/1까지의 분수들이 적힙니다. 이때 한 가지 더 발견할 수 있는 것이, 같은 대각선 상에 놓인 숫자들은 분자와 분모의 합이 같다는 점입니다. 따라서 n번째 대각선에 적히는 분수들은, 분자와 분모의 합이 n+1입니다.
지금까지 알아낸 규칙을 바탕으로 코드를 작성합니다. Line 17 ~ 23의 while문은 X의 범위를 찾는 반복문입니다. X가 몇 번째 대각선에 존재하는지 알아내기 위해, n을 1부터 증가시키며 확인합니다. X가 n번째 대각선에 속한다면, n을 증가시키지 않고 반복문을 빠져나옵니다. Line 25 ~ 33에서는 분자(numerator)와 분모(denominator)를 구합니다. 위에 구한 규칙 중, 짝수번째 대각선과 홀수번째 대각선은 반대라는 규칙이 었죠? 두 가지 경우를 나누어, 분자와 분모를 각각 구하면 됩니다.
반응형
'코딩 > 백준 BOJ' 카테고리의 다른 글
[백준/C언어] 10250번 - ACM 호텔 (0) | 2022.01.18 |
---|---|
[백준/C언어] 2869번 - 달팽이는 올라가고 싶다 (0) | 2022.01.17 |
[백준/C언어] 2292번 - 벌집 (0) | 2022.01.15 |
[백준/C언어] 1712번 - 손익분기점 (0) | 2022.01.14 |
[백준/C언어] 1316번 - 그룹 단어 체커 (0) | 2022.01.13 |